什么是方式最快,更强大的(唯一性而言)实施的方法等
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);
}
绝对不使用纯除了由于其线性度性能,但你可以稍稍修改代码以达到很好的分散。
public String hash(String[] values) {
long result = 17;
for (String v:values) result = 37*result + v.hashCode();
return String.valueOf(result);
}
它不提供一个64位的哈希值,但由于它可能是值得一提的是,自从Java 1.7有问题的标题java.util.Objects#哈希(对象...) 。
你应该注意相结合的方法时产生的弱点。 (该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的,因为它需要整数作为输入,而不是字节,但我认为它的工作原理一样好。
下面是使用对象类可用的Java 7的简单实现。
@Override
public int hashCode()
{
return Objects.hash(environmentId, switchName);
}
首先,散列码通常是数字,如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