我创建了两个TheKey类型为k1 = {17,1375984}和k2 = {17,1593144}的结构.显而易见,第二个字段中的指针是不同的.但两者都得到相同的哈希码= 346948941.预计会看到不同的哈希码.请参阅下面的代码.
struct TheKey
{
    public int id;
    public string Name;
    public TheKey(int id, string name)
    {
       this.id = id;
       Name = name;
   }
}
static void Main() {
    // assign two different strings to avoid interning
    var k1 = new TheKey(17, "abc");
    var k2 = new TheKey(17, new string(new[] { 'a', 'b', 'c' }));
    Dump(k1); // prints the layout of a structure
    Dump(k2);
    Console.WriteLine("hash1={0}", k1.GetHashCode());
    Console.WriteLine("hash2={0}", k2.GetHashCode());
}
unsafe static void Dump<T>(T s) …背景:
我们希望能够在查询中快速匹配这些字符串,而不会影响大量连接.
所以我想在主表中存储所有这些字符串的哈希码并将其包含在索引中,因此只有当哈希码匹配时才会由数据库处理连接.
那么我如何获得一个好的哈希码呢?我可以:
那人们怎么想?
最后,我只是连接字符串并计算连接的哈希码,因为它很简单并且工作得很好.
(如果你关心我们使用的是.NET和SqlServer)
Bug!,Bug!
引自 Eric Lippert的GetHashCode指南和规则
System.String.GetHashCode的文档特别指出,两个相同的字符串在CLR的不同版本中可以具有不同的哈希码,实际上它们也是如此.不要在数据库中存储字符串哈希并期望它们永远是相同的,因为它们不会.
所以不应该使用String.GetHashcode().