我正在解决一个问题,需要将两个等长的整数数组(例如 int a[] ={1,2,3,4}
和 int b[] ={1,2,2,6}
)存储在数据结构(例如 hashmap)中的对象。但是,对于不同的对象,这两个数组的长度可能会有所不同。这两个数组都由给定区间内的整数组成(例如 0-200)。
为了存储包含这两个数组的对象,我想分配一个单一的哈希键,这个键计算速度快,同时保留两个序列,并将导致最小的冲突。
我首先尝试使用Arrays.deepHashCode(int[][])
,但很快发现会出现冲突。其次,我尝试更均匀地分配数组中的值,通过将 a[i] 和 b[i] 更改为新值,使得 a_new[i] = Math.pow(31,a[i]) % Math.pow(2,16)
(实际上使用 BigInteger 避免溢出:BigInteger.valueOf(31).modPow(BigInteger.valueOf(a[i]), BigInteger.valueOf(Math.pow(2,16)))
; 使用 BigInteger。由于值的范围是有限的,我可以为每个可能的值预先计算它。结果,我想出了以下解决方案:
int result = 31;
for (int i = 0; i < a.length; i++) {
result = result * 31 * a_new[i];
result = result * 31 * b_new[i];
}
这种解决方案似乎在只有较小的数组时有效,但一旦a[]和b[]包含多达10个值,它也会导致冲突。现在我想知道是否有更好的方法来实现我想要的目标并减少冲突。
编辑:我修复了它,使用了适当的Java代码来计算幂次。