需要在java中更好地实现这个FNV哈希算法

时间:2013-12-10 17:47:58

标签: 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;
        hash ^= key.charAt(i);
    }

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

    return hash % array.length;
}

1 个答案:

答案 0 :(得分:0)

一些观察结果:

  • 现在人们普遍接受33是素数比31更好的选择,因为它可以减少大多数非英语语言中的碰撞(英语在任何一种情况下都有相同数量的碰撞)。
  • 将字符串转换为字符数组并以这种方式访问​​元素而不是多次调用charAt()可能会更快
  • 以下代码效率低下:

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

    这段代码更好,因为(1)它不使用处理器乘法指令,这是资源密集型的,(2)它不会定期产生分支错误预测:

    hash &= ~0x80000000;