如何计算字符串列表的良好哈希码?

Ian*_*ose 38 .net database-design hashcode

背景:

  • 我有一个简短的字符串列表.
  • 字符串的数量并不总是相同,但几乎总是在"少数"的顺序
  • 在我们的数据库中,这些字符串将存储在第二个规范化表中
  • 这些字符串在写入数据库后永远不会更改.

我们希望能够在查询中快速匹配这些字符串,而不会影响大量连接.

所以我想在主表中存储所有这些字符串的哈希码并将其包含在索引中,因此只有当哈希码匹配时才会由数据库处理连接.

那么我如何获得一个好的哈希码呢?我可以:

  • Xor将所有字符串的哈希码放在一起
  • Xor与每个字符串后面的结果相乘(比如31)
  • 将所有字符串组合在一起然后获取哈希码
  • 其他一些方式

那人们怎么想?


最后,我只是连接字符串并计算连接的哈希码,因为它很简单并且工作得很好.

(如果你关心我们使用的是.NET和SqlServer)


Bug!,Bug!

引自 Eric Lippert的GetHashCode指南和规则

System.String.GetHashCode的文档特别指出,两个相同的字符串在CLR的不同版本中可以具有不同的哈希码,实际上它们也是如此.不要在数据库中存储字符串哈希并期望它们永远是相同的,因为它们不会.

所以不应该使用String.GetHashcode().

Geo*_*off 47

标准的java实践,就是简单地写

final int prime = 31;
int result = 1;
for( String s : strings )
{
    result = result * prime + s.hashCode();
}
// result is the hashcode.
Run Code Online (Sandbox Code Playgroud)

  • 原因如下:http://stackoverflow.com/questions/299304/why-does-javas-hashcode-in-string-use-31-as-a-multiplier (6认同)