目标:创建一个带有2个整数键的哈希映射(使用unsigned int casting转换为整数的指针,这是有效的)并将其映射到单个值。
尝试解决方案:所以我已经有了一个哈希映射,它接受一个键并成功映射到值。我现在将它扩展为使用"pairing function"取两个键。所以我拿两个键,使用Cantor配对功能将它们配对,然后散列这个组合键。
瓶颈:所以两个键的问题是cantor配对函数执行乘法,导致整数溢出,因此“不”给我独特的输出,因为它应该在数学上做。
问题:
如果某些部分不清楚,请告诉我。
答案 0 :(得分:3)
您可能需要查看boost::hash_combine
答案 1 :(得分:1)
整数溢出并不是那么糟糕。是的,它可能会导致碰撞,但是对于散列图而言,哈希很少会发生罕见的碰撞。
也许是一个坏主意。它可能导致太多碰撞。
如果您的输入为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。