C# HashSet运算符是否基于GetHashCode()或Equals()工作?
C#HashSet定义了许多集合运算符,例如ExceptWith(…),它们需要将元素与另一个集合进行比较。这些方法是基于所比较对象的哈希代码工作的,还是使用Equals()?任何与哈希代码相关的方法都应该同时使用C# HashSet运算符是否基于GetHashCode()或Equals()工作?,c#,hashset,C#,Hashset,C#HashSet定义了许多集合运算符,例如ExceptWith(…),它们需要将元素与另一个集合进行比较。这些方法是基于所比较对象的哈希代码工作的,还是使用Equals()?任何与哈希代码相关的方法都应该同时使用GetHashCode和Equals(无论是直接对候选值调用还是通过IEqualityComparer) 哈希代码不能保证是唯一的:它们实际上只是一个初始过滤器。如果两个对象相等,则它们的哈希代码必须相同。。。但仅仅因为散列码是相同的并不意味着它们绝对相等 散列码用于非常快速地将一大组
GetHashCode
和Equals
(无论是直接对候选值调用还是通过IEqualityComparer
)
哈希代码不能保证是唯一的:它们实际上只是一个初始过滤器。如果两个对象相等,则它们的哈希代码必须相同。。。但仅仅因为散列码是相同的并不意味着它们绝对相等
散列码用于非常快速地将一大组可能的匹配缩小到具有相同散列码的非常小的候选集。(散列集同时记住元素及其散列代码,这样就可以检查散列代码,而无需每次重新计算它们。)然后依次使用Equals
检查每个候选项,以确定它是否真的是匹配项
在哈希表
和字典
中使用相同的逻辑,尽管在实现上可能存在细微差异。(列出了几种变体。)任何与哈希代码相关的操作都应该同时使用GetHashCode
和Equals
(无论是直接在候选值上调用还是通过IEqualityComparer
)
哈希代码不能保证是唯一的:它们实际上只是一个初始过滤器。如果两个对象相等,则它们的哈希代码必须相同。。。但仅仅因为散列码是相同的并不意味着它们绝对相等
散列码用于非常快速地将一大组可能的匹配缩小到具有相同散列码的非常小的候选集。(散列集同时记住元素及其散列代码,这样就可以检查散列代码,而无需每次重新计算它们。)然后依次使用Equals
检查每个候选项,以确定它是否真的是匹配项
在
哈希表
和字典
中使用相同的逻辑,尽管在实现上可能存在细微差异。(列表中列出了几种变体。)两者都有!对象首先通过hashcode进行比较,然后通过Equals()
(如果hashcodes匹配)进行比较。仅使用GetHashCode
显然会被破坏GetHashCode
具有(实际)冲突。如果您使用大的加密哈希(比如SHA-256),但不使用低质量的32位哈希,那么依赖哈希相等就可以了。两者都可以!对象首先通过hashcode进行比较,然后通过Equals()
(如果hashcodes匹配)进行比较。仅使用GetHashCode
显然会被破坏GetHashCode
具有(实际)冲突。如果使用大的加密哈希(比如SHA-256),但不使用低质量的32位哈希,那么依赖哈希相等就可以了。