2011-09-14 21 views
3

简短问题:如何获得已重新实施GetHashCode()的对象的object.GetHashCode()值?如何从重新实现GetHashCode的类中获取原始哈希码?

长篇小说: 所以我有大约十万个对象,每个对象共享许多(非编译时间)常见字符串。如果值相等,那么通常就是同一个实例。我知道,我宁愿使用标准对象比较(ReferenceEquals)而不是完整的字符串比较 - 尤其是因为这些字典是在相当规范的基础上在字典中查找的。

因此,我声明class ReferenceEqualityComparer : IEqualityComparerDictionary<string, TValue>一起使用,认为无论如何它会是有用的,并尝试实施这两种方法。

等于是很容易,使用object.ReferenceEquals

但是,如何获得等效的GetHashCode方法?

即如何获得对象实例的某种表示形式?

我知道还有其他办法,我可以去这样做 - 创建一个InternedString类持有的string的引用,但没有实现EqualsGetHashCode,或存储索引,而不是每个对象的字符串,但我现在好奇 - 是否有一种方法来实现一个通用的ReferenceEqualityComparer

+0

乔恩Skeet肯定给出了如何做你正在做的事情的简单而正确的答案。不过,我的倾向是将每个字符串包装在一个简单的不可变结构中,该结构只保存对字符串的引用,并覆盖GetHashCode和Equals以在所包含的字符串上调用RuntimeHelpers.GetHashCode或Object.ReferenceEquals。 – supercat

+0

我不喜欢使用ReferenceEquals和String类型的暴露对象,因为很多代码都希望任何String对象都可以被具有相同长度和内容的其他对象替换,而不会影响程序语义。在大多数情况下,只包含单个类引用的值类型应该非常像引用类型;我意识到的最大问题是如果将这种类型转换为Object或接口类型,则会将其封装。 – supercat

+0

嗨超级猫,这将是一个选择是的。就其本身而言,所有字符串都只用于不可变的内部类 - 不是公有的,并且没有被规则中断字符串替换的危险。但是我可能只是为了正确的目的而遵循你的建议 - 然而,在没有RuntimeHelpers的知识的情况下,我甚至无法知道如何做到这一点,默认情况下struct.GetHashCode的速度非常慢。 – Mania

回答