相关疑难解决方法(0)

ValueType.GetHashCode的原生实现如何工作?

我创建了两个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) …
Run Code Online (Sandbox Code Playgroud)

c# hash struct

39
推荐指数
2
解决办法
6769
查看次数

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

背景:

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

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

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

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

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

那人们怎么想?


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

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


Bug!,Bug!

引自 Eric Lippert的GetHashCode指南和规则

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

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

.net database-design hashcode

38
推荐指数
1
解决办法
3万
查看次数

标签 统计

.net ×1

c# ×1

database-design ×1

hash ×1

hashcode ×1

struct ×1