在我的项目中,我需要通过序列化接口为给定对象生成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一样。
答案 0 :(得分:0)
我想,通过哈希表,你的意思是std::unordered_map<K, V>
或你自己的实现。
如果哈希表中的条目相对较少且插入删除操作有限,则可以使用std::map<K, V>
(我希望您的serilization模板具有std::map
的重载方法)或等效的数据结构这将保证引擎下的排序顺序(平衡二叉搜索树)。因此,序列化的对象将产生相同的希望。 std::map
上的操作占用对数时间,因此对于10k条目,每次插入/删除时合理log2(10k) = 10
次操作。
正如你所说,你有大约10k条目,我认为使用固定加载因子不是一个好主意,因为它可能会影响哈希表的性能。