如何为哈希表生成基于内容的sha1?

How to generate a content based sha1 for hash table?

本文关键字:于内容 sha1 哈希表      更新时间:2023-10-16

在我的项目中,我需要通过序列化接口为给定对象生成一个sha1,如下所示:

class sha1_sink : public isink{...};
sha1_sink sink;
serialize(sink, obj);
return sink.get_digest();

序列化是一个模板函数,针对不同类型的重载。

它在大多数情况下都运行良好,除了哈希表。

根据设计,如果对象 A 与 B 具有相同的内容,则它们应该具有相同的 sha1。顺序对哈希表毫无意义,因此如果哈希表 A 和 B 具有相同的元素,但顺序不同,则应将它们视为相同。

一种解决方案是在函数序列化的乞求处首先对其进行排序,但显然,它很慢并且需要额外的内存。

我可以通过在序列化之前使用预定义值(例如 0.5)设置负载因子来重新散列它,我认为元素的顺序会很稳定,即使它需要调整哈希表。

但我认为以上都不够好,我想寻求更好的解决方案。如果有人能告诉我如何走上正确的道路,我将不胜感激。

对于哈希表,它是一个通用容器,就像 std::unordered_map/set 一样。

我想,通过哈希表,你的意思是std::unordered_map<K, V>或你自己的实现。

如果哈希表中的条目相对较少并且插入删除操作有限,您可以使用std::map<K, V>(我希望您的 serilization 模板具有用于std::map的重载方法)或等效的数据结构,这将保证底层的排序顺序(平衡二叉搜索树)。因此,我希望序列化的对象将产生相等的对象。对std::map的操作需要对数时间,因此对于 10k 个条目,每次插入/删除的合理log2(10k) = 10操作。

正如您所说,您有大约 10k 个条目,我认为使用固定负载因子不是一个好主意,因为它可能会影响哈希表性能。