如果我有一个未知的动态大小的选项,我想为它们做一个java Hash函数,对所有可能性使用相同的Hash是否正确?
即 -
输入可以是数字[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种可能性,我不想全部创建它们,所以我按需创建它们。
如果我想使用set [1,2,45,51],那么我想首先检查“set”表中是否存在(例如,通过哈希)这个集合,如果不存在,我想想要添加它。
id的表是动态的,它可以增长到100,这会将集的数量改为2 ^ 100。
我的目的是以最快的方式找到一个集合的存在。
(我还考虑将id表示为位,如果我们想找到一个[1,2,5],我们将搜索10011)
答案 0 :(得分:0)
如果我理解正确,你想要long
数组的哈希值? (原始类型long
可以处理从-2^63
到2^63
的范围内的数字
我建议您使用:
int java.util.Arrays.hashCode(long a[])
这将为32 bit
提供一个哈希值,这是我感觉最简单的方法。
根据您的编辑,您似乎想要一个只有MyNumberImplem上的自定义哈希码的java.util.HashSet正是您搜索的内容,因此建议您最好地实现这一点:让您的IDE为您工作。
我写这个:
public class NumberContainer {
private long[] data;
public NumberContainer(long[] data) {
super();
this.data = data.clone();
}
}
我使用方法生成HashCode和Equals(总是写两个方法togegther!)eclipse中的菜单是Source菜单(右键单击或在Frame工具栏上):
@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是一个基于HashCode对包含方法进行优化的集合,以更好地优化你的效率,你可以做与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;
}
}