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

时间:2017-03-27 15:10:44

标签: c++ git algorithm hash

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

class sha1_sink : public isink{...};

sha1_sink sink;
serialize(sink, obj);
return sink.get_digest();

serialize是一个模板函数,并为不同类型重载。

它在大多数情况下都很好用,除了哈希表。

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

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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

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