我研究了std::hash
个引用,发现它无法对序列化数据进行哈希处理,例如char*
。这是正确还是正常?如何散列序列化缓冲区?
答案 0 :(得分:0)
std::hash
的想法是为固定大小的数据提供一般的哈希算法,这种算法对于大多数用途来说已经足够好了,因此用户不需要每次都自己滚动。可变长度输入的问题在于散列它们是一个更复杂的问题,通常取决于数据本身的特性,要求标准库包含这样的算法,因此实现受到开发人员的惩罚。例如,对于ASCII字符串很有效的哈希算法对于主要包含零的数据可能效果不是很好,后者的好算法可能会给字符串带来太多的冲突。 (还有速度权衡;一些哈希算法可能对所有事情都很有效,但速度太慢。)
因此,您应该使用相同的API(即必须定义std::hash
)编写自己的哈希类,而不是使用size_t operator()(Key)
,并将该类作为Hash
模板传递哈希使用模板的参数,如std::unordered_set
。