Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何为哈希表生成基于内容的sha1?_C++_Git_Algorithm_Hash - Fatal编程技术网

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

C++ 如何为哈希表生成基于内容的sha1?,c++,git,algorithm,hash,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有相同

在我的项目中,我需要通过序列化接口为给定对象生成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一样

我猜,通过hashtable,您的意思是
std::unordered_map
或您自己的实现

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


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

在最坏的情况下,您的哈希表中有多少元素?我认为在我的项目中,10k是一个合理的假设。我不确定您为什么要将其交叉发布到,但我会注意到Git的
对象,在某些方面也有类似的问题,通常是从排序索引构建的,即Git采用“保持哈希表排序”的方法。这对于Git来说很好,因为一旦树作为数据库中的对象存在,它就永远不会被更改;排序工作发生在其他地方,其成本分摊到索引的其他用途上。只需将所有包含的哈希代码异或在一起,这是顺序无关的。我认为这太激进了,但它启发了我,我可以搜索更好的算法吗。我在问题中添加了一些信息。同意,调整负载系数不是一个好的理想。哈希表将由用户程序员用于一般用途。std::map已受支持。我想提供哈希表,只是因为它在一些时间敏感的查询中比std::map好。