繁体   English   中英

GetHashCode 是否足够强大,还是我需要另一个 hash function?

[英]Is GetHashCode strong enough or do I need another hash function?

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

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

我有一个想法将所有内容转换为字节数组(长度 8)或整数数组(长度 2)并获取 C# GetHashCode 方法

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

EOG

GetHashCode 并非旨在创建唯一标识符 - 它的主要用途是为散列数据结构(如 HashTable)中的存储桶分配值 - 请参阅http://ericlippert.com/2011/02/28/guidelines-and-rules- for-gethashcode/ . 当我需要一个 object 的唯一标识符,并且由于某种原因 object 本身不提供唯一标识符时,我通常只使用 GUID。 它们在 C# 中生成是微不足道的,并且保证在 scope 中是唯一的,无论您在做什么。

GetHashCode 纯粹用于字典中的散列。 由于可能发生 hash 冲突,您不应在任何地方使用它作为标识符。 它返回 Int32,例如,对于 String,它显然可能有超过 2,147,483,647 个唯一字符串。 两个不同的字符串可以具有相同的 hash 代码。 话虽如此,您有两种选择:

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM