如何用std :: hash散列缓冲区?

时间:2014-12-30 03:43:08

标签: c++ stdhash

我研究了std::hash个引用,发现它无法对序列化数据进行哈希处理,例如char*。这是正确还是正常?如何散列序列化缓冲区?

1 个答案:

答案 0 :(得分:0)

std::hash的想法是为固定大小的数据提供一般的哈希算法,这种算法对于大多数用途来说已经足够好了,因此用户不需要每次都自己滚动。可变长度输入的问题在于散列它们是一个更复杂的问题,通常取决于数据本身的特性,要求标准库包含这样的算法,因此实现受到开发人员的惩罚。例如,对于ASCII字符串很有效的哈希算法对于主要包含零的数据可能效果不是很好,后者的好算法可能会给字符串带来太多的冲突。 (还有速度权衡;一些哈希算法可能对所有事情都很有效,但速度太慢。)

IIRC,用于ASCII字符串的旧的旧哈希算法是将每个字符的ASCII值简单地相乘。毋庸置疑,这真的很快,只有因为没有零而有效。

因此,您应该使用相同的API(即必须定义std::hash)编写自己的哈希类,而不是使用size_t operator()(Key),并将该类作为Hash模板传递哈希使用模板的参数,如std::unordered_set