我们如何编写具有给定素数的多项式哈希函数
How can we write a polynomial hash function with given prime
那么对于给定的素数 31,我该如何为字符串参数编写哈希函数?
这是我的尝试。
private int hash(String key){
int c = 31;
int hash = 0;
for (int i = 0; i < key.length(); i++ ) {
int ascii = key.charAt(i);
hash += c * hash + ascii;
}
return (hash % sizetable);} // sizetable is an integer which is declared outside. You can see it as a table.length().
所以,由于我不能运行工作中的任何其他功能,我需要确定这里的流程,所以我需要您的回答和帮助!非常感谢。
您的实施看起来与 documented 作为标准 String.hashCode()
实施非常相似,它甚至还使用 31 作为质因数,所以应该足够好了。
我只是不会将 31
分配给变量,而是声明一个 private static final
字段或直接将其用作幻数 - 一般情况下不行,但在这种情况下可能没问题。
此外,您应该添加一些测试 - 如果您已经了解单元测试的概念 - 以证明您的方法为不同的字符串提供不同的哈希值。并巧妙地挑选样本,所以它们是不同的(对于家庭作业的情况;)
那么对于给定的素数 31,我该如何为字符串参数编写哈希函数?
这是我的尝试。
private int hash(String key){
int c = 31;
int hash = 0;
for (int i = 0; i < key.length(); i++ ) {
int ascii = key.charAt(i);
hash += c * hash + ascii;
}
return (hash % sizetable);} // sizetable is an integer which is declared outside. You can see it as a table.length().
所以,由于我不能运行工作中的任何其他功能,我需要确定这里的流程,所以我需要您的回答和帮助!非常感谢。
您的实施看起来与 documented 作为标准 String.hashCode()
实施非常相似,它甚至还使用 31 作为质因数,所以应该足够好了。
我只是不会将 31
分配给变量,而是声明一个 private static final
字段或直接将其用作幻数 - 一般情况下不行,但在这种情况下可能没问题。
此外,您应该添加一些测试 - 如果您已经了解单元测试的概念 - 以证明您的方法为不同的字符串提供不同的哈希值。并巧妙地挑选样本,所以它们是不同的(对于家庭作业的情况;)