【问题标题】:HASH functions and implementing multi key hash mapsHASH 函数和实现多键哈希映射
【发布时间】:2012-11-05 06:55:23
【问题描述】:

目标:创建一个哈希映射,它采用 2 个整数键(使用无符号整数转换将指针转换为整数,是的,这是可行的)并将其映射到单个值。

尝试的解决方案:所以我已经有一个哈希映射,它采用单个键并将其成功映射到值。我现在将它扩展到使用"pairing function" 获取两个键。所以我拿了两个键,使用 Cantor 配对函数将它们配对,然后对这个组合键进行哈希处理。

瓶颈:所以两个键的问题是康托尔配对函数进行乘法运算会导致整数溢出,因此“不会”给我唯一的输出,因为它应该在数学上做。

问题

  1. 我看到很多散列函数都进行乘法运算。整数溢出是散列中的正常现象还是很糟糕?
  2. 我还考虑将另一个键附加到一个新的 64 位整数中。就像 aaaaaaaabbbbbbbb 一样,然后将其传递给哈希映射。但我担心这可能会由于浮点表示而导致出现像 NaN 这样的异常数字,这可能很糟糕。
  3. 欢迎任何更好的想法。

如果某些部分不清楚,请告诉我。

【问题讨论】:

  • 数学上这些东西假设你的整数是无限精度的,这就是为什么它不能马上那么容易地工作。

标签: c++ c math hash hashmap


【解决方案1】:

你可能想看看boost::hash_combine

【讨论】:

  • 所以我不能使用第三方库。我需要自己创建一个,如果你能对内部结构有所了解,那就太好了!
  • 看一下 boost 代码。组合方法非常简单。你可以直接使用boost.org/doc/libs/1_51_0/doc/html/hash/…
【解决方案2】:
  1. 整数溢出并没有那么糟糕。确实,它可能会导致冲突,但对于用于哈希映射的哈希来说很少发生冲突是可以的。

  2. 也许是个坏主意。它可能会导致太多的冲突。

  3. 如果您的输入为N 位宽,那么您的输出必须至少为2N 位宽。因此,要容纳uint 输入,您需要ulong 大小的输出。如果输入高于该值,则会导致溢出。如果输出小于该值,则会出现冲突/重复。

但确实没有多少函数适合2N 大小。你可以试试

a * uint.MaxValue + b

this

a >= b ? a * a + a + b : a + b * b

这两个都是无符号长整数。这两个是最节省空间的。

另见Mapping two integers to one, in a unique and deterministic way

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 2023-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-10-13
    • 2016-03-25
    相关资源
    最近更新 更多