Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 散列以在大范围内均匀分布值_Java_Hash - Fatal编程技术网

Java 散列以在大范围内均匀分布值

Java 散列以在大范围内均匀分布值,java,hash,Java,Hash,我想设计一种算法,它接受一组值,并将其均匀分布在更大的范围内。我有1000个值,希望将它们分布在值2^16的范围内。 此外,输入值可以连续更改,我需要通过哈希函数不断解析每个输入值,以便它在我的输出范围内均匀分布 我应该使用什么样的哈希算法? 我正在用Java编写代码。如果您只是对整数进行散列,这里有一种方法 public class Hasho { private static final Long LARGE_PRIME = 948701839L; private sta

我想设计一种算法,它接受一组值,并将其均匀分布在更大的范围内。我有1000个值,希望将它们分布在值2^16的范围内。 此外,输入值可以连续更改,我需要通过哈希函数不断解析每个输入值,以便它在我的输出范围内均匀分布

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

如果您只是对整数进行散列,这里有一种方法

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;
    }
}
公共类Hasho{
专用静态最终长大_素数=948701839L;
专用静态最终长大_PRIME2=6920451961L;
公共静态void main(字符串[]args){
对于(int i=0;i<100;i++){
System.out.println(i+“->”+散列(i));
}
}
公共静态int散列(int i){
//传播价值观
长标度=(长)i*LARGE_素数;
//填入较低的位
长位移=标度+大_素数2;
//在较低的32位上加上会丢失的较高位
//转换为int。
长填充=移位+((移位&0xFFFFFFFF00000000L)>>32);
//在这种情况下,将其缩减为31位。如果需要,则将7替换为F
//想要负数,或者完全去掉“&mask”部分。
掩蔽整数=(整数)(填充和0x7FFFFFFF);
返回蒙面;
}
}

这只是一个例子,说明如何做到这一点。在专业质量的散列函数中有一些重要的数学运算。

我确信这有一个名称,但这是我们在黑暗时代对ISAM文件所做的

  • 增加一个数字,例如16001
  • 将字符串(即10061)反转,就得到了哈希值
  • 您可能希望按位反转字符串

  • 这产生了一个很好的均匀分布。我们曾经将其与工作编号一起使用,这样您就可以相当轻松地检索工作,因此,如果你有一个“幻数”候选者,这可能很有用。

    你的值的初始分布也是均匀的吗?不。初始分布是不均匀的。我是否正确地认为你想要一个哈希函数,它可以接受未知大小和范围的非均匀分布,并将其映射到相同大小的均匀分布,范围为0..2^16?散列的数据类型是什么?如果我告诉你一个函数生成了一个均匀分布,你怎么知道我说的是不是真的?这不会把一个小范围的值扩展到一个大范围,是吗?如果幻数有正确的位数,它会的。当我第一次看到它运行时,我很惊讶,在一个六位数的作业编号上,它将它们很好地分布在磁盘上。