如何实现自己的字符串哈希函数?

Nez*_*rik 1 java hash overriding hashtable

这是生成字符串哈希码的默认算法:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

然而,我想使用一些不同的、更简单的东西,比如添加每个字符的 ASCII 值,然后将它们全部相加。

当我对哈希表使用 put() 方法时,如何使其使用我创建的算法,而不是使用默认算法?

到目前为止,我不知道除了从头开始实现哈希表之外还能做什么。

Alb*_*ina 10

创建一个新类,并String在其中使用类型字段。例如:

public class MyString {
    private final String value;

    public MyString(String value) {
        this.value = value;
    }

    public String getValue() {
        return value;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyString myString = (MyString) o;
        return Objects.equals(value, myString.value);
    }

    @Override
    public int hashCode() {
        // use your own implementation
        return value.codePoints().sum();
    }
}
Run Code Online (Sandbox Code Playgroud)

添加带有注释的equals()hashCode()方法@Override注意:此处hashCode()仅对 ASCII 值进行操作。

之后,您将能够在所需的数据结构中使用新的类对象。在这里equals()您可以找到这些方法的详细说明以及和之间的合同hashCode()