哈希在大范围内均匀分配价值

时间:2010-09-29 21:08:38

标签: java hash

我想设计一种算法,该算法采用一组值并在更大的范围内均匀分布。例如。我有1000个值,并希望在2 ^ 16的值范围内分配它们。 此外,输入值可以连续变化,我需要通过散列函数继续解析每个输入值,以便它在我的输出范围内均匀分布。

我应该使用什么哈希算法呢? 我正在用Java编写代码。

2 个答案:

答案 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文件所做的事情

  1. 增加数字,例如16001
  2. 反转字符串即。 10061你有你的哈希
  3. 您可能希望按字符串反转字符串
  4. 这会产生很好的均匀传播。我们过去常常将它与作业号一起使用,以便您可以相当轻松地检索作业,因此如果您有一个“幻数”候选者,这可能很有用。