我正在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个值生成唯一值.

例如,如果输入值(ab)被限制在0到999的范围内,则可以创建一个计算1000*a + b的散列函数,这将是所有受限制的输入值的唯一值.

Java相关问答推荐

为什么接口中的主函数而不是类中的主函数在Java 17中编译和运行没有问题?

具有额外列的Hibert多对多关系在添加关系时返回NonUniqueHealthExcellent

inteliJ中是否有一个功能可以自动在块注释中的/*后面添加一个空格?''

根据对象和值的参数将映射<;T、值&>转换为列表<;T&>

Spring Boot@Cachebale批注未按预期工作

R.id.main给我一个红色错误,无法解析MainActivity.java中的符号main

调用引发泛型异常的泛型方法时出现编译错误

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

将带有js文件的 bootstrap 程序导入maven项目时出错

基于接口的投影、原生查询和枚举

声明MessageChannel Bean的首选方式

Sack()步骤中的合并运算符未按预期工作

在学习Spring时,通过构造函数参数0表达了不满意的依赖关系

buildDir:File!&#的getter解决方案是什么?39.被抛弃

Dijkstra搜索算法的实现

try 使用类来包含JSON响应

A.ForEach与For(类型a:集合)

java构造函数中的冻结操作何时发生?

单例模式中热切初始化和惰性初始化的区别

语句打印在错误的行(Java Token 问题)