【发布时间】:2016-06-22 07:48:37
【问题描述】:
我必须将一个对象与同一类的原始属性进行比较。 意思是,我必须比较那些:
struct Identifier
{
string name;
string email;
}
使用两个字符串名称和电子邮件。 我知道我可以为姓名和电子邮件创建一个新的标识符实例并将其传递给 equals()。我的应用程序必须非常快速且节省资源。
我知道通过哈希码进行比较不是一个好方法,因为正如 here 所解释的那样,存在冲突。但碰撞对我来说没问题,我只需要它快。
所以,
1) 是通过GetHashCode进行比较(检查两个对象的hashcode是否相同)比Equals()快?
2) 我是否应该为比较创建两个值的 Identifier 的新实例,创建一个直接获取值的新方法?例如
struct Identifier {
string name;
string email;
bool Equals(string name, string email) {
// todo comparison via hashcode or equals
}
}
I would use the Equals() and GetHashCode() method generated by resharper.
【问题讨论】:
-
GetHashCode 不是用于相等比较,而是用于获取哈希码。 C# 中的哈希码是 32 位信息,而您的字符串在技术上可能包含无限量的信息。所以完全不同的字符串可能具有相同的哈希码。推荐阅读-stackoverflow.com/questions/371328/…
-
C# 是否缓存字符串的 hashCode?因为如果你必须即时计算它,那将比比较两个字符串要慢。
-
@Thilo No, it doesn't。但是计算两个字符串的哈希码非常快,您绝对应该在自己的
GetHashCode实现中使用它们。 -
在您的 GetHashCode 实现中:当然。但不需要在 Equals 期间调用它,对吧?
-
这不是它的工作方式,代码可能使用 GetHashCode() 来更快地进行比较。但是 仍然 需要使用 Equals() 因为哈希码不能是唯一的。
标签: c# performance comparison