Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何从重新实现GetHashCode的类中获取原始哈希代码?_C#_Hash_Dictionary_Iequalitycomparer - Fatal编程技术网

C# 如何从重新实现GetHashCode的类中获取原始哈希代码?

C# 如何从重新实现GetHashCode的类中获取原始哈希代码?,c#,hash,dictionary,iequalitycomparer,C#,Hash,Dictionary,Iequalitycomparer,简短问题:如何为重新实现的对象获取GetHashCode()值 说来话长: 所以我有大约十万个对象,每个对象共享许多(非编译时)公共字符串。如果值相等,则为同一实例 知道了这一点,我想我宁愿使用标准的对象比较(ReferenceEquals),而不是完整的字符串比较——特别是因为这些比较是在字典中定期查找的 因此,我声明了一个类引用equalitycomparer:IEqualityComparer来与字典一起使用,我认为它无论如何都是有用的,并开始尝试实现这两种方法 Equals很简单,使用对

简短问题:如何为重新实现的对象获取
GetHashCode()

说来话长: 所以我有大约十万个对象,每个对象共享许多(非编译时)公共字符串。如果值相等,则为同一实例

知道了这一点,我想我宁愿使用标准的对象比较(
ReferenceEquals
),而不是完整的字符串比较——特别是因为这些比较是在字典中定期查找的

因此,我声明了一个
类引用equalitycomparer:IEqualityComparer
来与
字典一起使用,我认为它无论如何都是有用的,并开始尝试实现这两种方法

Equals很简单,使用
对象。ReferenceEquals

但是如何为
GetHashCode
方法获得与
object.GetHashCode()
等效的值呢

ie如何获得对象实例的一些表示


我知道还有其他方法可以做到这一点-创建一个
InternedString
类,该类包含对
字符串的引用,但不实现
等于
GetHashCode
,也不存储每个对象的索引而不是字符串,但我现在很好奇——是否真的有一种方法可以实现一个通用的
引用平等比较程序

来看看。

Jon Skeet肯定给出了一个简单而正确的答案,告诉你该怎么做。不过,我倾向于将每个字符串包装在一个简单的不可变结构中,该结构只保留对字符串的引用,并覆盖GetHashCode和Equals,以便在封闭字符串上调用RuntimeHelpers.GetHashCode或Object.ReferenceEquals。我不喜欢对字符串类型的公开对象使用ReferenceEquals,因为很多代码都希望任何字符串对象都可以替换为具有相同长度和内容的任何其他对象,而不会影响程序语义。在大多数情况下,只包含一个类引用的值类型的行为应该非常类似于引用类型;我所知道的最大的问题是,如果强制转换为对象或接口类型,这样的类型将被装箱。尽管如此,所有的字符串只在不可变的内部类中使用——不是公共的,并且没有被违反规则的字符串替换的危险。但是我可能只是为了更正而遵循你的建议-但是,昨天,在不了解RuntimeHelper的情况下,我甚至不知道如何做到这一点,因为默认的struct.GetHashCode速度非常慢。Supercat,让你知道我确实听从了你的建议,让自己成为InternedString结构,使用InternedString.Pool工厂类。需要考虑一点,我决定在添加每个字符串时创建一个新字符串,纯粹是为了让来自不同池的两个InternedString永远不会比较相等,这可能会导致一些难以跟踪的错误。默认的结构GetHashCode和Equals会调用String.GetHashCode和String.Equals,这与您的目的不完全一样。如果需要,您可以让每个结构与字符串一起保存一个Int64序列号(对所有池的共享序列号使用Interlocked.Increment);结构的GetHashcode可以返回Int64的低位字,Equals可以简单地比较Int64值,而不考虑字符串内容。这将需要更多的空间来存放结构,但避免了防御性地复制字符串。