从多个Java字符串对象创建哈希

PNS*_*PNS 9 java hash md5 hashcode sha

实现类似方法的最快和更强大(就唯一性而言)的方法是什么

public abstract String hash(String[] values);
Run Code Online (Sandbox Code Playgroud)

values[]阵列具有100到1,000个成员,每个成员具有几十个字符,并且该方法每次需要在不同的values[]阵列上运行大约10,000次/秒.

是应该使用StringBuilder缓冲区构建长字符串,然后在缓冲区内容上调用哈希方法,还是继续为每个字符串调用哈希方法values[]

显然,需要至少64位的散列(例如,MD5)来避免冲突,但是在相同的质量下,是否有更简单,更快的方法可以做到?

例如,怎么样

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

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

    return String.valueOf(result);
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 10

由于其线性属性,绝对不要使用普通加法,但您可以稍微修改您的代码以实现非常好的色散.

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


Gir*_*san 10

下面是使用 Java 7 中提供的 Objects 类的简单实现。

@Override
public int hashCode()
{
    return Objects.hash(this.variable1, this.variable2);
}
Run Code Online (Sandbox Code Playgroud)


Oli*_*man 5

它没有提供64位散列,但鉴于问题的标题,可能值得一提的是,自Java 1.7以来,有java.util.Objects #hash(Object ...).