据this Eric博客,GetHashCode方法会为不同的AppDomain之间的对象返回不同的结果吗?
规则:GetHashCode的消费者不能依靠它随着时间的过去或跨应用程序域稳定。 假设您有一个Customer对象,其中包含诸如Name,Address等字段。如果在两个不同的进程中使两个这样的对象具有完全相同的数据,则它们不必返回相同的哈希码。如果星期二在一个进程中创建了这样一个对象,关闭它,并在周三再次运行该程序,哈希代码可能会不同。 这已经让过去的人感到困扰。 System.String.GetHashCode的文档特别指出,两个相同的字符串可以在CLR的不同版本中具有不同的哈希码,事实上它们的确可以。不要在数据库中存储字符串哈希值,并期望它们永远保持不变,因为它们不会。
我使用这个类,
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public string ModelNumber { get; set; }
public string Sku { get; set; }
public string Description { get; set; }
public double Price { get; set; }
public double NewPrice { get; set; }
public override int GetHashCode()
{
return Id^(Name ?? "").GetHashCode()^(ModelNumber ?? "").GetHashCode()^(Sku ?? "").GetHashCode()^ (Description ?? "").GetHashCode()^Price.GetHashCode()^NewPrice.GetHashCode();
}
}
我节省了产品性能的哈希对象在数据库中更改跟踪。意味着哈希码会告诉我对象是否改变了。如果可以在应用程序域之间更改散列,那么另一种方式是什么?
这不是'GetHashCode'的用途。事实上,这正是你*不应该使用它的原因。为什么不使用'version'列或类似的东西呢? – Luaan 2014-09-03 11:36:02
创建对象后,不允许更改'GetHashCode'的值。你**不能**基于可变的字段/属性。唯一一次可以将哈希码作为属性的基础是那些属性只能在构造函数中读取和设置。如果字典代码改变,像字典这样的东西就会失败。 – Enigmativity 2014-09-03 12:35:34
@Enigmativity,我在不同的AppDomain(或进程)上说同一个对象,或者在不同的日子打开exe。 – user960567 2014-09-03 12:37:06