未知数量大小的通用哈希值

时间:2018-06-18 09:37:33

标签: java algorithm hash

如果我有一个未知的动态大小的选项,我想为它们做一个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)

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你想要long数组的哈希值? (原始类型long可以处理从-2^632^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;
    }
}