【发布时间】:2011-07-30 23:38:07
【问题描述】:
我需要为一个对象生成一个唯一的哈希码,基于它的内容,例如。 DateTime(2011,06,04) 应该等于 DateTime(2011,06,04)。
- 我不能使用 .GetHashCode(),因为它可能会为具有不同内容的对象生成相同的哈希码。
- 我无法使用 ObjectIDGenerator 中的 .GetID,因为它会为具有相同内容的对象生成不同的哈希码。
- 如果对象包含其他子对象,则需要递归检查这些。
- 它需要处理集合。
我需要写这个的原因是什么?我正在使用 PostSharp 编写一个缓存层。
更新
我想我可能一直在问错误的问题。正如 Jon Skeet 指出的那样,为了安全起见,我需要缓存键中的唯一组合与对象中潜在数据的组合一样多。因此,最好的解决方案可能是构建一个长字符串,使用反射对对象的公共属性进行编码。对象不会太大,因此非常快速高效:
- 构造缓存键的效率很高(只需将对象的公共属性转换为大字符串)。
- 它可以有效地检查缓存命中(比较两个字符串)。
【问题讨论】:
-
当您说“内容”时,您到底是什么意思?公共财产?还有什么?
-
您是说您希望一个值保证是唯一的,并且如果对象或其聚合中的任何内容发生更改,则该值会发生更改。您是否意识到这意味着您想将可能无限量的信息压缩到一个有限长度的数据结构中?
-
我想要一个基于对象内容的 GUID。我不介意每 10 万亿年左右是否偶尔会出现重复。
-
@Gravitas:我的“无限”评论意味着您很难将这样的
IEnumerable合并到哈希中:while(true) yield return 1;。 -
将对象序列化为字符串,然后获取字符串值的MD5。唯一的问题是 [Serializable] 属性。
标签: c# .net visual-studio-2010 .net-4.0 hash