Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.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# HashSet运算符是否基于GetHashCode()或Equals()工作?_C#_Hashset - Fatal编程技术网

C# HashSet运算符是否基于GetHashCode()或Equals()工作?

C# HashSet运算符是否基于GetHashCode()或Equals()工作?,c#,hashset,C#,Hashset,C#HashSet定义了许多集合运算符,例如ExceptWith(…),它们需要将元素与另一个集合进行比较。这些方法是基于所比较对象的哈希代码工作的,还是使用Equals()?任何与哈希代码相关的方法都应该同时使用GetHashCode和Equals(无论是直接对候选值调用还是通过IEqualityComparer) 哈希代码不能保证是唯一的:它们实际上只是一个初始过滤器。如果两个对象相等,则它们的哈希代码必须相同。。。但仅仅因为散列码是相同的并不意味着它们绝对相等 散列码用于非常快速地将一大组

C#HashSet定义了许多集合运算符,例如ExceptWith(…),它们需要将元素与另一个集合进行比较。这些方法是基于所比较对象的哈希代码工作的,还是使用Equals()?

任何与哈希代码相关的方法都应该同时使用
GetHashCode
Equals
(无论是直接对候选值调用还是通过
IEqualityComparer

哈希代码不能保证是唯一的:它们实际上只是一个初始过滤器。如果两个对象相等,则它们的哈希代码必须相同。。。但仅仅因为散列码是相同的并不意味着它们绝对相等

散列码用于非常快速地将一大组可能的匹配缩小到具有相同散列码的非常小的候选集。(散列集同时记住元素及其散列代码,这样就可以检查散列代码,而无需每次重新计算它们。)然后依次使用
Equals
检查每个候选项,以确定它是否真的是匹配项

哈希表
字典
中使用相同的逻辑,尽管在实现上可能存在细微差异。(列出了几种变体。)

任何与哈希代码相关的操作都应该同时使用
GetHashCode
Equals
(无论是直接在候选值上调用还是通过
IEqualityComparer

哈希代码不能保证是唯一的:它们实际上只是一个初始过滤器。如果两个对象相等,则它们的哈希代码必须相同。。。但仅仅因为散列码是相同的并不意味着它们绝对相等

散列码用于非常快速地将一大组可能的匹配缩小到具有相同散列码的非常小的候选集。(散列集同时记住元素及其散列代码,这样就可以检查散列代码,而无需每次重新计算它们。)然后依次使用
Equals
检查每个候选项,以确定它是否真的是匹配项


哈希表
字典
中使用相同的逻辑,尽管在实现上可能存在细微差异。(列表中列出了几种变体。)

两者都有!对象首先通过hashcode进行比较,然后通过
Equals()
(如果hashcodes匹配)进行比较。仅使用
GetHashCode
显然会被破坏
GetHashCode
具有(实际)冲突。如果您使用大的加密哈希(比如SHA-256),但不使用低质量的32位哈希,那么依赖哈希相等就可以了。两者都可以!对象首先通过hashcode进行比较,然后通过
Equals()
(如果hashcodes匹配)进行比较。仅使用
GetHashCode
显然会被破坏
GetHashCode
具有(实际)冲突。如果使用大的加密哈希(比如SHA-256),但不使用低质量的32位哈希,那么依赖哈希相等就可以了。