从创建几个Java String对象的哈希(Creating a hash from several

2019-06-24 10:41发布

什么是方式最快,更强大的(唯一性而言)实施的方法等

public abstract String hash(String[] values);

values[]阵列具有100〜1000的成员,每一个其与几十个字符,并且该方法需要在不同的运行约10,000次/秒values[]每次阵列。

应的长字符串是建立使用StringBuilder上调用缓冲内容缓冲区,然后散列方法,或者是它更好地保持从调用用于每个字符串的散列法values[]

显然,至少需要64位的散列(例如,MD5),以避免碰撞,但有没有什么简单和快速的可以做,在相同的质量?

例如,关于什么

public String hash(String[] values)
{
    long result = 0;

    for (String v:values)
    {
        result += v.hashCode();
    }

    return String.valueOf(result);
}

Answer 1:

绝对不使用纯除了由于其线性度性能,但你可以稍稍修改代码以达到很好的分散。

public String hash(String[] values) {
  long result = 17;
  for (String v:values) result = 37*result + v.hashCode();
  return String.valueOf(result);
}


Answer 2:

它不提供一个64位的哈希值,但由于它可能是值得一提的是,自从Java 1.7有问题的标题java.util.Objects#哈希(对象...) 。



Answer 3:

你应该注意相结合的方法时产生的弱点。 (该Java的哈希函数和你自己)。 我做了级联密码一个小小的研究,这是它的一个例子。 (加可能与hashCode的内部干扰()。

hashCode()方法的内部看起来就像这样:

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }

因此增加数相加将导致所有字符串的最后一个字符数组中只是添加,不会降低随机性(这已经够糟糕的了哈希函数)。

如果你想真正的伪随机性,看看在FNV散列算法。 这是在那里最快的哈希算法,专为HashMaps这样设计的。

它是这样的:

    long hash = 0xCBF29CE484222325L;
    for(String s : strings)
    {
        hash ^= s.hashCode();
        hash *= 0x100000001B3L;
    }

^这不是实际执行FNV的,因为它需要整数作为输入,而不是字节,但我认为它的工作原理一样好。



Answer 4:

下面是使用对象类可用的Java 7的简单实现。

@Override
public int hashCode()
{
    return Objects.hash(environmentId, switchName);
}


Answer 5:

首先,散列码通常是数字,如int 。 而且你的哈希函数的版本创建int和会将此恕我直言,没有任何意义的字符串表示。

我想提高你的哈希方法如下:

public int hash(String[] values) {
    long result = 0;
   for (String v:values) {
        result = result * 31 + v.hashCode();
    }
    return result;
}

采取一看hashCode()在类中实现java.lang.String



文章来源: Creating a hash from several Java string objects