通过Equals或HashCode比较。 哪个更快?
我必须将对象与同一类的原始属性进行比较。 意思是,我必须比较这些:
struct Identifier
{
string name;
string email;
}
与两个字符串的名称和电子邮件。 我知道我可以为名称和电子邮件创建一个新的标识符实例,并将其传递给equals()。 我的应用程序必须非常快速且节省资源。
我知道通过hashcode进行比较不是一个好方法,因为这里解释的是碰撞。 但碰撞对我来说没问题,我只需要它快。
所以,
1)通过GetHashCode比较(检查两个对象的哈希码是否相同)比Equals()更快?
2)我是否应该创建一个新的比较两个值的标识符实例,做一个直接采用这个值的新方法? 例如
struct Identifier {
string name;
string email;
bool Equals(string name, string email) {
// todo comparison via hashcode or equals
}
}
我将使用由resharper生成的Equals()和GetHashCode()方法。
如果将它们保存在Identifier
实例上(见下文),比较哈希码可能会更快。 然而,与平等比较并不是一回事。
比较哈希码可以让你检查两个项目是否绝对不相等:当你得到不同的哈希码时,你就会知道这一点。
但是,如果散列码相同,则无法就等同性作出明确声明:项目可能相等或不相等。 这就是为什么基于散列的容器必须总是遵循散列码比较,直接或间接比较相等性。
尝试执行这样的比较:
struct Identifier {
string name;
string email;
int nameHash;
int emailHash;
public Identifier(string name, string email) {
this.name = name;
nameHash = name.GetHashCode();
this.email = email;
emailHash = email.GetHashCode();
}
bool Equals(string name, string email) {
return name.GetHashCode() == nameHash
&& email.GetHashCode() == emailHash
&& name.equals(this.name)
&& email.equals(this.email);
}
}
与预先计算的哈希代码相比,实际的相等比较会短路,所以当大多数比较最终返回false
时,可以节省一些CPU周期。
通过GetHashCode比较(检查两个对象的哈希码是否相同)比Equals()更快?
你似乎混淆了这两个概念。 GetHashCode
的目的不是寻求两个对象实例之间的平等,而是简单地让每个对象都可以轻松地为任何可能对其进行中继的外部资源提供散列码值。
Equals
,在另一方面,有没有确定的平等。 应该是这两种产生对等的true
方法提供相同的哈希码,但不是相反。
关于object.GetHashCode
的文档提供了一个非常好的解释:
两个相同的返回哈希码相等的对象。 然而,相反的情况并非如此:相同的散列码并不意味着对象相等,因为不同的(不相等的)对象可以具有相同的散列码。 此外,.NET Framework不保证GetHashCode方法的默认实现,并且此方法返回的值可能在.NET Framework版本和平台(例如32位和64位平台)之间有所不同。 由于这些原因,请勿将此方法的默认实现用作散列目的的唯一对象标识符。 由此产生两个后果:
如果你想检查两个实例之间的平等,我绝对推荐实现IEquatable<T>
并覆盖object.GetHashCode
。
作为一个方面说明 - 我看到你正在使用一个struct
。 你应该注意到struct
在C#中的语义不同于C ++或C,我希望你知道它们。
上一篇: Comparison via Equals or HashCode. which is faster?
下一篇: Is there a way to derive IEqualityComparer from IComparer?