【发布时间】:2021-01-20 01:21:10
【问题描述】:
我需要一个可以将字符串作为输入并从中生成哈希码的函数。目前,在 c++ 中,我们有 std::hash 来执行此操作,但这会返回 size_t(unsigned long long) 类型的哈希码。在这里,我需要一个哈希函数,它可以给我签名 long long 类型的哈希码。
我也尝试过使用模数运算符,但这给了我负值,而且这些值不可靠。因此,请就我可以在 C++ 中使用的散列函数提供建议,以便我得到签名 long long 类型的散列码。
【问题讨论】:
-
既然
hash % n_buckets不能是负数(不调用Undefined Behavior)——为什么要返回一个有符号数? -
取你最喜欢的
signed long long toSigned(unsigned long long),并应用到std::hash的结果中 -
@Caleth,在 C++ 中没有名为 toSigned 的函数..
-
@DavidC.Rankin,我试过 (hash % std::numeric_limits
::max() ),但这也给了我由于溢出的负值。你能详细解释一下你的逻辑吗?... -
使用哈希表时,您有一个
n指针数组,指向您的表节点类型。指针(元素)的数量称为表的“桶”数量。当您散列一个值时,您会创建一些唯一的数字,然后将其取模n,例如hash % n。这告诉您节点进入哪个桶(元素)。由于您的节点是链表的节点,因此在发生冲突时,您将节点与桶中的节点链接在一起作为 head 列表中的节点。由于hash % n不能为负数(没有负数数组索引),所以使用有符号很奇怪。
标签: c++ c++11 hash long-integer