我研究std::hash
了 的参考资料,发现它不能散列序列化数据,例如char*
. 是正确的还是正常的?如何散列序列化缓冲区?
问问题
1629 次
1 回答
0
其想法std::hash
是为固定大小的数据提供通用散列算法,该算法足以满足大多数用途,因此用户无需每次都自行滚动。可变长度输入的问题在于,对它们进行散列处理是一个更复杂的问题,通常取决于数据本身的特征,要求标准库包含这样的算法,因此将实现交给开发人员。例如,适用于 ASCII 字符串的哈希算法可能不适用于大部分包含零的数据,而适用于后者的好的算法可能会给字符串带来过多的冲突。(也有速度权衡;一些散列算法可能对所有事情都很好,但太慢了。)
IIRC 是一种用于 ASCII 字符串的旧哈希算法,它只是简单地将每个字符的 ASCII 值相乘。不用说,这真的很快,而且只有在没有零时才有效。
因此std::hash
,您应该使用相同的 API 编写自己的散列类(即必须定义size_t operator()(Key)
),而不是使用 ,并将该类作为Hash
模板参数传递给使用散列的模板,例如std::unordered_set
.
于 2014-12-30T03:52:51.273 回答