【问题标题】:Universal Hash Function Implementation for Strings in JavaJava中字符串的通用哈希函数实现
【发布时间】:2021-12-30 07:28:39
【问题描述】:

我在理解 Java 中通用哈希函数的实现时遇到了一些麻烦。 哈希函数(ax + b) mod p应该在H_1的基础上实现。 此实现也适用于字符串。

我最近在做这个:

public class UniversalHashing {
    // the hash function is a linear function (h(x) = (ax + b) mod p)
    // where a and b are chosen randomly
    // p is a prime number

    private int a;
    private int b;
    private int p;

    public UniversalHashing(int a, int b, int p) {
        this.a = a;
        this.b = b;
        this.p = p;
    }

    public int hash(String string) {
        int hash = 0;
        for (int i = 0; i < string.length(); i++) {
            hash = (hash * a + string.charAt(i)) % p;
        }
        return (hash + b) % p;
    }

    public static void main(String[] args) {
        UniversalHashing h = new UniversalHashing(5, 3, 11);
        System.out.println(h.hash("hello"));
        System.out.println(h.hash("world"));
        System.out.println(h.hash("hello"));
        System.out.println(h.hash("world"));
    }
}

这个实现是正确的,还是我在为 String 实现通用哈希函数的路径上完全错误。

感谢您帮助我解决这个问题 格蕾丝

【问题讨论】:

标签: java hash computer-science universal-hashing


【解决方案1】:

或者类似的东西?

import java.math.BigInteger;

public class UniversalHashing {
    private final BigInteger a,b;
    private final long p = 1000000007;

    public UniversalHashing(long m) {
        a = BigInteger.valueOf((long) (Math.random() * p));
        b = BigInteger.valueOf((long) (Math.random() * (p - 1L)));
    }

    public int hashCode(String string) {
        BigInteger hash = BigInteger.valueOf(0);
        for (int i = 0; i < string.length(); i++) {
            hash = hash.add(BigInteger.valueOf(string.charAt(i)).multiply(a.pow(i)));
        }
        return (int) (hash.mod(BigInteger.valueOf(p)).add(b).mod(BigInteger.valueOf(p)).longValue());
    }

    public static void main(String[] args) {
        UniversalHashing uh = new UniversalHashing(1000000007);
        System.out.println(uh.hashCode("abc"));
        System.out.println(uh.hashCode("abcd"));
        System.out.println(uh.hashCode("abcde"));
    }
}

【讨论】:

  • 这会建立一个巨大的 BigInteger,然后最终减少它。这可以避免,并且可以仅使用 intlong 完成等效的数学运算(迭代地跟踪 a 的当前功率)
  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
猜你喜欢
  • 2013-05-08
  • 1970-01-01
  • 2017-03-06
  • 2022-12-04
  • 2015-03-09
相关资源
最近更新 更多