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

本文关键字:另一个 函数 哈希 GetHashCode | 更新日期: 2023-09-27 18:05:11

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

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

我有一个想法,将所有转换为字节数组(长度8)或int数组(长度2),并获得c# GetHashCode方法

GetHashCode是否足够强大,可以用作此数据的标识符?也许有人有更好的主意?

小城镇

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

GetHashCode并不是要创建一个唯一的标识符——它的主要用途是为散列数据结构(如HashTable)中的桶分配值——参见http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/。当我需要对象的唯一标识符,而由于某些原因对象本身没有提供唯一标识符时,我通常会求助于guid。在c#中生成它们很简单,并且保证在您所做的任何范围内都是唯一的。

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

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

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

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

为什么不将整个结构转换为long呢?