【发布时间】:2018-10-08 00:59:51
【问题描述】:
我有一个std::basic_string 的特化,比如string_t,它与std::string 相同,除了第三个模板参数是我的自定义分配器。
问题:我应该如何使用 C++ 标准库中已经提供的散列函子为这个专业定义一个散列函子类?
我知道如何定义一个哈希函子,但我不知道如何利用std 中现有的std::hash<..> 函子来定义我的自定义函子。我犹豫是否要编写自己的哈希操作,因为我知道它是在重新发明轮子,而且不太可能比 std::hash<std::string> 更好,因为 string_t 和 std::string 之间的唯一区别只是分配器。
cppreference 有一些示例,但它们对我没有多大帮助 - 我不想使用我的 string_t 对象的 c_str() 方法构造一个临时的std::string 对象,只是为了将临时对象提供给@987654334 @ 获取哈希值,因为它需要分配临时堆内存。
我正在使用 C++14,我想坚持使用标准库。
【问题讨论】:
-
在 C++17 中你可以使用
std::hash<std::string_view> -
@Caleth 确实,但我没有 C++17 并且有一些外部约束。我什至写了我的自定义 string_view。
-
您尚未说明您将使用此哈希的目的。这是一个至关重要的问题。如果您打算使用它将字符串存储到标准散列容器(std::unordered_map,std::unordered_set)中,那么您的散列函数可以很简单,因为这里对低碰撞概率和均匀分布没有严格要求(尽管它是如果是这样就更好了)。如果您要将它用于加密或低冲突概率要求,那么它会变得更加复杂。
-
@BJovke 我将为散列容器使用散列。
-
@Leedehai 好吧,在这种情况下,您可以将字符串的缓冲区转换为,例如,
char32_t的数组(最后一个带有填充的元素),对所有值进行异或运算并将结果提供给 @ 987654337@.