HASH功能和实现多键哈希映射

时间:2012-11-05 06:55:24

标签: c++ c math hash hashmap

目标:创建一个带有2个整数键的哈希映射(使用unsigned int casting转换为整数的指针,这是有效的)并将其映射到单个值。

尝试解决方案:所以我已经有了一个哈希映射,它接受一个键并成功映射到值。我现在将它扩展为使用"pairing function"取两个键。所以我拿两个键,使用Cantor配对功能将它们配对,然后散列这个组合键。

瓶颈:所以两个键的问题是cantor配对函数执行乘法,导致整数溢出,因此“不”给我独特的输出,因为它应该在数学上做。

问题

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

2 个答案:

答案 0 :(得分:3)

您可能需要查看boost::hash_combine

答案 1 :(得分:1)

  1. 整数溢出并不是那么糟糕。是的,它可能会导致碰撞,但是对于散列图而言,哈希很少会发生罕见的碰撞。

  2. 也许是一个坏主意。它可能导致太多碰撞。

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

  4. 但事实上,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