我正在try 根据数组中的整数计算散列.我希望具有不同整数的数组不具有相同的哈希码:
给定[72,99]并执行Arrays.hashcode([72,99]),我得到3292
给定[73,68]并执行Arrays.hashcode([73,68]),我也得到3292
有人知道为什么会发生这种情况,并有一个替代我试图实现什么?
我正在try 根据数组中的整数计算散列.我希望具有不同整数的数组不具有相同的哈希码:
给定[72,99]并执行Arrays.hashcode([72,99]),我得到3292
给定[73,68]并执行Arrays.hashcode([73,68]),我也得到3292
有人知道为什么会发生这种情况,并有一个替代我试图实现什么?
根本没有足够的可能哈希码值来为整数数组生成唯一的哈希码.
Hashcode值是int
,最多可以有2^32个不同的值.
int[1]
包含单个int
,它可以有2^32个不同的值.对于这样的数组,您可以创建一个散列函数,为它包含的int
的所有值生成唯一的散列值(Arrays.hashCode()
计算这样的值).
int[2]
包含2个int
,它们加在一起可以有2^64个不同的值.这意味着您不能创建产生唯一散列值的散列函数--您必然会有许多冲突.
这就是为什么像HashMap
这样的数据 struct 不能仅依赖哈希码--它们还必须使用equals()
方法.
无论你使用Arrays.hashCode()
的值是不够的.你也必须使用Arrays.equals()
来区分具有相同hashcode的array.
根据您的特定用例,可以手动创建一个散列函数,为每对int
个值生成唯一值.
例如,如果输入值(a
和b
)被限制在0到999的范围内,则可以创建一个计算1000*a + b
的散列函数,这将是所有受限制的输入值的唯一值.