2011-08-11 38 views
1

我正在实现数据序列化,并遇到一个问题。 我有:GetHashCode足够强大还是需要另一个散列函数?

  • 4字节字段:
    • 值的范围在0-255
    • 值的范围在0〜4
    • 值的范围在0-255
    • 值的范围在0〜100
  • and 1 int field(only positive values)

我有一个想法,convet所有字节数组(lenght 8)或int数组(lenght 2),并获得C#的GetHashCode方法

的GetHashCode是足够强大的标识符这个数据使用? 或者有人有更好的主意,也许?

EOG

回答

3

的GetHashCode并不意味着创建一个唯一的标识符 - 它的主要用途是在哈希数据结构分配值到桶(如哈希表) - 见http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/。当我需要一个对象的唯一标识符时,由于某种原因,对象本身不提供一个,所以我通常只会回退GUID。在C#中生成它们并不重要,并且保证在你所做的任何事情范围内都是唯一的。

+0

他们不保证是唯一的,它们很可能是。 – jason

1

GetHashCode纯粹用于字典中的散列。由于可能的hash collisions,您不应将其用作任何标识符。它返回Int32并且对于字符串,例如显然可能有超过2,147,483,647个唯一字符串。两个不同的字符串可以具有相同的散列码。话虽如此,你有两种选择:

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

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

0

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

为什么不把整个结构转换为long作为使用?

+0

不适用于'长'。 – jason

+0

当然 - b/c GetHashCode返回一个int!。 Opps :) –

相关问题