我想设计一种算法,该算法采用一组值并在更大的范围内均匀分布。例如。我有1000个值,并希望在2 ^ 16的值范围内分配它们。 此外,输入值可以连续变化,我需要通过散列函数继续解析每个输入值,以便它在我的输出范围内均匀分布。
我应该使用什么哈希算法呢? 我正在用Java编写代码。
答案 0 :(得分:2)
如果你只是哈希整数,这是一种方式。
public class Hasho {
private static final Long LARGE_PRIME = 948701839L;
private static final Long LARGE_PRIME2 = 6920451961L;
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
System.out.println(i + " -> " + hash(i));
}
}
public static int hash(int i) {
// Spread out values
long scaled = (long) i * LARGE_PRIME;
// Fill in the lower bits
long shifted = scaled + LARGE_PRIME2;
// Add to the lower 32 bits the upper bits which would be lost in
// the conversion to an int.
long filled = shifted + ((shifted & 0xFFFFFFFF00000000L) >> 32);
// Pare it down to 31 bits in this case. Replace 7 with F if you
// want negative numbers or leave off the `& mask` part entirely.
int masked = (int) (filled & 0x7FFFFFFF);
return masked;
}
}
这只是一个展示如何完成的例子。在专业品质的哈希函数中有一些严肃的数学。
答案 1 :(得分:0)
我确定它有一个名字,但这是我们过去在黑暗时代对ISAM文件所做的事情
这会产生很好的均匀传播。我们过去常常将它与作业号一起使用,以便您可以相当轻松地检索作业,因此如果您有一个“幻数”候选者,这可能很有用。