c++ - 如何使用 std::hash 散列缓冲区?

标签 c++ stdhash

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

最佳答案

std::hash 的想法是为固定大小的数据提供一种通用的哈希算法,该算法足以满足大多数用途,因此用户无需每次都自己滚动。可变长度输入的问题是对它们进行散列是一个复杂得多的问题,通常取决于数据本身的特性,要求标准库包含这样的算法,因此实现被推给了开发人员。例如,适用于 ASCII 字符串的哈希算法可能不适用于主要包含零的数据,而适用于后者的良好算法可能会导致字符串冲突过多。 (也有速度权衡;一些散列算法可能适用于所有情况,但速度太慢。)

IIRC 是一种古老的 ASCII 字符串哈希算法,它简单地将每个字符的 ASCII 值相乘。不用说,这真的很快,而且只有在没有零的情况下才有效。

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

关于c++ - 如何使用 std::hash 散列缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27699327/

相关文章:

C++ 在自定义类/结构数组的构造函数中获取数组键?

c++ - std::hash 和/或 boost::hash 的目的是什么?

c++ - 为什么不同字符串的 std::Hash 相等?

c++ - 为什么 std::hash 是结构而不是函数?

c++ - 具有任意数量基本类型属性的对象的 std::hash 变体

c++ - std::vector::push_back() 不能在 MSVC 上为具有已删除移动构造函数的对象编译

c++ - g++4.4 : iostream move semantics

c++ - 如何使用 QGraphicsView 的缩放级别缩放 QGraphicsEllipseItem

c++ - 将指针数组作为参数,然后将其分配给一个字段

c++ - const 和非常量类型的部分 std::hash 特化