2013-12-10 23 views
0

我有这个,我想使它更有效率,如果你需要我创建的整个哈希集数据结构,我可以添加它,但即时通讯整体寻找这样的东西这发生在我的自定义实现一个HashSet的任何数量的字符串,并将它们存储:需要在java中更好的实现这个FNV哈希算法

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; 
} 
+0

如果你想为一个字符串数组生成哈希码,我们已经建立了像'Arrays.hashCode(Object [])':'Arrays.hashCode(strArray)'这样的函数。简单而高效 – Sage

+0

对不起,我没有说,没有使用的Java API,我必须逐字添加 – user3080111

+0

请让它更清楚一点。你将一个String传递给哈希函数,但是返回语句有'array.length':这个数组来自哪里? – Sage

回答

0

几个意见:

  • 它是普遍接受的这些天,33是黄金的一个更好的选择,而不是31,因为这会导致大多数非英语语言中的冲突更少(英语与大约相同的语言无论哪种方式,都会有数量的碰撞)。
  • 你的字符串转换为字符数组以及访问的方式,而不是调用的charAt()多次很可能是元素更快
  • 下面的代码是无效的:

    if (hash < 0) 
        hash *= -1; 
    

    此代码是更好的,因为(1)它不使用处理器乘法指令,其是资源密集的,并且(2)也不会产生转移误预测周期性:

    hash &= ~0x80000000;