需要在java中更好地实现这个FNV哈希算法吗
我有这个,我想让它更高效,如果您需要我创建的整个hashset数据结构,我可以添加它,但我总体上在寻找这样的东西,它可以接受任意数量的字符串,并将它们存储在我的自定义hashset实现中:需要在java中更好地实现这个FNV哈希算法吗,java,oop,data-structures,hash,Java,Oop,Data Structures,Hash,我有这个,我想让它更高效,如果您需要我创建的整个hashset数据结构,我可以添加它,但我总体上在寻找这样的东西,它可以接受任意数量的字符串,并将它们存储在我的自定义hashset实现中: private int hash(String key) { int prime = 31; int hash = 0; for(int i = 0; i < key.length(); i++) { hash *= prime;
private int hash(String key)
{
int prime = 31;
int hash = 0;
for(int i = 0; i < key.length(); i++)
{
hash *= prime;
hash ^= key.charAt(i);
}
if (hash < 0)
hash *= -1;
return hash % array.length;
}
一些意见:
如今,人们普遍认为33比31是更好的素数选择,因为在大多数非英语语言中,33会导致更少的冲突。无论哪种方式,英语的冲突数量都差不多。
将字符串转换为字符数组并以这种方式访问元素而不是多次调用charAt可能会更快
以下代码效率低下:
if (hash < 0)
hash *= -1;
如果您想为字符串数组生成哈希代码,那么我们已经内置了类似Arrays.hashCodeObject[]:Arrays.hashCodestrArray的函数。简单高效对不起,我没有说,不使用java api,我必须逐字添加,请你说得更清楚一点。您正在将字符串传递给哈希函数,但返回语句具有array.length:此数组来自何处?它是hashset数组,它具有一个设置的数量,把它想象成一个数字,答案是:public int FNVString word{int hash=0;for int i=0;i
hash &= ~0x80000000;