GetHashCode是否足够强大还是我需要另一个哈希函数?

时间:2011-08-11 20:16:01

标签: c# .net hash

我正在实施数据序列化,但我遇到了一个问题。 我有:

  • 4字节字段:
    • 值范围0-255
    • 值范围0-4
    • 值范围0-255
    • 值范围0-100
  • 和1个int字段(仅正值)

我有一个想法是将所有字节数组(lenght 8)或int数组(lenght 2)传递给C#GetHashCode方法

GetHashCode强大到足以用作此数据的标识符吗? 或者有人有更好的想法,也许?

EOG

3 个答案:

答案 0 :(得分:3)

GetHashCode并不是要创建唯一标识符 - 它的主要用途是将值分配给散列数据结构中的存储区(如HashTable) - 请参阅http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/。当我需要一个对象的唯一标识符,并且由于某种原因,对象本身不提供一个,我通常会回到GUID。它们在C#中生成是微不足道的,并保证在您正在做的任何事情范围内都是唯一的。

答案 1 :(得分:1)

GetHashCode纯粹用于字典中的散列。您不应该在任何地方使用它作为标识符,因为可能hash collisions。它返回Int32,对于String,例如,显然可以有超过2,147,483,647个唯一字符串。两个不同的字符串可以具有相同的哈希码。说过你有两个选择:

1)如果您需要从实际值派生您的标识符。例如,如果您需要快速判断是否已经保留了新的Object而未反序列化所有对象并将它们与相关对象进行比较。例如,您可以在SHA1上使用ComputeHash

2)如果您不需要从实际值派生标识符,您可以简单地生成Guid,如bbogovich所示。

答案 2 :(得分:0)

int和long的GetHashCode()值(< int.MaxValue)与值相同,但对于数组,值不稳定。所以不要使用它。

为什么不将整个结构转换为long使用它?