如果我有一个未知的选项动态大小,我想为它们做一个 java 哈希函数,对所有可能性使用相同的哈希是否正确?
即 -
输入可以是数字[0-1000],也可以是[0-2^40]。
我希望该函数给我一个尽可能唯一的输出,并且它会尽可能平均地分布输入。
例如 - f(x) = x % 100
将尽可能平均地分布输入,但我很确定它不是那么有效......
哈希(即使是好的哈希)对所有输入仍然有效吗?
谢谢。
编辑
我有 id 列表。我想将该列表的 id 集(即 - [1,3,5,16,22] 或 [2,23,43,44])散列到一个集合表中,以查明数字集是否是否存在。
例如 - 我有一张 id 为 [0-70] 的表格,以及一张我已经使用过的集合表格。集合有 2^70 种可能,我不想全部创建,所以我按需创建。
如果我想使用集合 [1,2,45,51] 所以我想首先检查这个集合是否存在于“集合”表中(例如通过散列),如果不存在,我想添加它。
id 表是动态的,它可以增长到 100,这会将集合的数量更改为 2^100。
我的目的是以最快的方式找到集合的存在性。
(我还考虑过将 id 表示为一个位,如果我们想找到一个集合 [1,2,5],我们将搜索 10011)
最佳答案
如果我没理解错的话,你想要一个 long
数组的散列? (原始类型 long
可以处理从 -2^63
到 2^63
范围内的数字)
我建议你使用:
int java.util.Arrays.hashCode(long a[])
这将为您提供 32 位
上的哈希,这是我认为最简单的方法。
根据您的编辑,您似乎想要一个在 MyNumberImplem 上只有一个自定义哈希码的 java.util.HashSet 正是您搜索的内容,因为这建议您执行此操作的最佳实践:让您的 IDE 为您工作。
我只是写这个:
public class NumberContainer {
private long[] data;
public NumberContainer(long[] data) {
super();
this.data = data.clone();
}
}
我使用 Generate HashCode 和 Equals 方法(总是将这两种方法写在一起!)eclipse 中的菜单是源菜单(右键单击或在您的框架工具栏上):
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + Arrays.hashCode(data);
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
NumberContainer other = (NumberContainer) obj;
if (!Arrays.equals(data, other.data))
return false;
return true;
}
java.util.HashSet 是一个 Collection,它对基于 HashCode 的 contains 方法进行了优化,以优化您的效率,您可以做与 java.lang.String 相同的事情并缓冲您的哈希码结果,这将成为您的类:
import java.util.Arrays;
public class NumberContainer {
private final long[] data;
public NumberContainer(long[] data) {
super();
this.data = data.clone();
}
private Integer hashCode = null;
@Override
public int hashCode() {
if (hashCode == null) {
final int prime = 31;
int result = 1;
hashCode = prime * result + Arrays.hashCode(data);
}
return hashCode;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
NumberContainer other = (NumberContainer) obj;
if (!Arrays.equals(data, other.data))
return false;
return true;
}
}
关于java - 未知数字大小的通用哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50906535/