java - 未知数字大小的通用哈希

标签 java algorithm hash

如果我有一个未知的选项动态大小,我想为它们做一个 java 哈希函数,对所有可能性使用相同的哈希是否正确?

即 -

输入可以是数字[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 种可能,我不想全部创建,所以我按需创建。

如果我想使用集合 [1,2,45,51] 所以我想首先检查这个集合是否存在于“集合”表中(例如通过散列),如果不存在,我想添加它。

id 表是动态的,它可以增长到 100,这会将集合的数量更改为 2^100。

我的目的是以最快的方式找到集合的存在性。

(我还考虑过将 id 表示为一个位,如果我们想找到一个集合 [1,2,5],我们将搜索 10011)

最佳答案

如果我没理解错的话,你想要一个 long 数组的散列? (原始类型 long 可以处理从 -2^632^63 范围内的数字)

我建议你使用:

int java.util.Arrays.hashCode(long a[])

这将为您提供 32 位 上的哈希,这是我认为最简单的方法。

根据您的编辑,您似乎想要一个在 MyNumberImplem 上只有一个自定义哈希码的 java.util.HashSet 正是您搜索的内容,因为这建议您执行此操作的最佳实践:让您的 IDE 为您工作。

我只是写这个:

public class NumberContainer {
    private long[] data;

    public NumberContainer(long[] data) {
        super();
        this.data = data.clone();
    }
}

我使用 Generate HashCode 和 Equals 方法(总是将这两种方法写在一起!)eclipse 中的菜单是源菜单(右键单击或在您的框架工具栏上):

@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 是一个 Collection,它对基于 HashCode 的 contains 方法进行了优化,以优化您的效率,您可以做与 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;
    }
}

关于java - 未知数字大小的通用哈希,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50906535/

相关文章:

Java - 如何为基类和派生类实现方法克隆

java - 在 Google 工作表中插入日期并在单元格中附加 '

algorithm - 从数字中去除前导/尾随数字的最佳方法是什么?

python - 从 O(n) 中的列表生成分类数据集

Ruby - 在变量中存储表格数据的最佳方式

php - password_hash 每次返回不同的值

string - 来自字符串的不可逆唯一 ID

java - 即使使用 LockModeType.PESSIMISTIC_WRITE 也会发生死锁

java - 在 GlassFish Server 上创建并运行应用程序客户端

java - socks 商家问题: i am trying to do this with a different approach