如何为哈希表生成基于内容的sha1?
How to generate a content based sha1 for hash table?
在我的项目中,我需要通过序列化接口为给定对象生成一个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 个条目,我认为使用固定负载因子不是一个好主意,因为它可能会影响哈希表性能。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 你能重载对象变量名本身返回的内容吗
- 如何将内容数组写入文本文件?
- 试图让变量检查数组中的某些内容
- initializer_list中字符串的内容为何为空
- c++r值引用应用于函数指针
- 如果编译的源代码是特定于它编译的硬件的,我们如何分发它
- 使用Qt C++计算类似Git的SHA1哈希
- 如何仅使用对象名称打印特定于对象的成员
- 相当于LocaleMatcher的ICU4C
- 等<thing>效于char32_t
- C++宏忽略之后的内容
- Java 中是否有类似于 C++ 中引用类型"&"的内容?
- 结构化绑定:当某些内容看起来像引用并且行为类似于引用,但它不是引用时
- CMake:C++包含相对于基目录的内容
- 如何为哈希表生成基于内容的sha1?
- 在这种情况下,是否有类似于C++03的constexpr的内容
- visual C#代码后面的内容相当于C++CLI
- 我如何使以下内容适用于类的函数成员