3 int 的哈希码没有冲突
Hashcode for 3 int without collisions
你能帮我找到计算具有 3 个 int 参数的 class 哈希码的最佳方法吗(比方说 a
、b
、c
)每个参数的值可能在预定义范围内?我的意思是 a
应该在 a1
到 a2
的某个范围内,b
相应地从 b1
到 b2
和 c
正如您可能猜到的 c1
到 c2
。所有这些 a1、a2、b1... 都是常量,并且在构建哈希码时已知。我希望避免碰撞。
首先,确保变体总数 - 产品 (a2 - a1) * (b2 - b1) * (c2 - c1)
适合您的哈希码容量。如果要使用 32 位无符号整数,则该值应小于 2^32
.
通过选择一些初始值 s
开始构造哈希码(您可以选择零,从而有效地忽略初始值)。然后对每个参数执行以下操作:
- 将当前哈希码值乘以当前参数范围(即
a2 - a1
)
- 将当前调整到范围参数值添加到哈希码值
对于三个参数的情况,公式为
((s*(a2 - a1) + (a - a1))*(b2 - b1) + (b - b1))*(c2 - c1) + (c - c1)
其中 s
是可选的起始值
编辑
添加的参数值应调整到其范围
你能帮我找到计算具有 3 个 int 参数的 class 哈希码的最佳方法吗(比方说 a
、b
、c
)每个参数的值可能在预定义范围内?我的意思是 a
应该在 a1
到 a2
的某个范围内,b
相应地从 b1
到 b2
和 c
正如您可能猜到的 c1
到 c2
。所有这些 a1、a2、b1... 都是常量,并且在构建哈希码时已知。我希望避免碰撞。
首先,确保变体总数 - 产品 (a2 - a1) * (b2 - b1) * (c2 - c1)
适合您的哈希码容量。如果要使用 32 位无符号整数,则该值应小于 2^32
.
通过选择一些初始值 s
开始构造哈希码(您可以选择零,从而有效地忽略初始值)。然后对每个参数执行以下操作:
- 将当前哈希码值乘以当前参数范围(即
a2 - a1
) - 将当前调整到范围参数值添加到哈希码值
对于三个参数的情况,公式为
((s*(a2 - a1) + (a - a1))*(b2 - b1) + (b - b1))*(c2 - c1) + (c - c1)
其中 s
是可选的起始值
编辑
添加的参数值应调整到其范围