我试图使用该GetHashCode()
值来确定一个对象在通过ASP.NET MVC应用程序中的ajax调用验证后是否已更改.但是,我注意到这不起作用,因为验证期间返回的哈希码值与在验证请求之后从另一个请求中的模型绑定再次创建对象时生成的哈希码不同.我能够通过创建SHA哈希来解决这个问题,但我很好奇我为什么会看到这种行为.
我知道生成的哈希码GetHashCode()
不应该持久存在,并且可能随着时间的推移而在不同平台上有所不同.当我第一次提出这个想法时,我认为时间段足够短,因为这两个调用是以毫秒为单位进行的,并且在调试时我确认模型包含完全相同的值,但仍然产生了不同的哈希码.
我很好奇为什么会出现这种行为.为什么会发生这种情况,即使这是应用程序的单次运行,尽管是Web应用程序?这与ASP.NET生命周期有关吗?
如果需要这里我使用的类和GetHashCode实现:
class DispositionSubmission { [Display(Name = "Client")] [Required(AllowEmptyStrings = false, ErrorMessage = "Client is required.")] public string ClientId { get; set; } public string Carrier { get; set; } public DictionaryDispositionInfo { get; set; } public DispositionType Type { get; set; } //int based enum ... public override int GetHashCode() { unchecked { int hash = (int)15485863; int bigPrime = (int)15485867; hash = hash * bigPrime ^ ClientId.GetHashCode(); hash = hash * bigPrime ^ (Carrier ?? "").GetHashCode(); hash = hash * bigPrime ^ DispositionInfo.GetHashCode(); hash = hash * bigPrime ^ Type.GetHashCode(); return hash; } } }
Scott Chambe.. 5
DispositionInfo
没有覆盖的类型GetHashCode()
.其中具有相同对象的两个相同的词典将具有不同的哈希码.
您需要将您的调整GetHashCode()
设置为不包含字典或使其更复杂,以获取字典中每个键和值的哈希码并将其添加.
DispositionInfo
没有覆盖的类型GetHashCode()
.其中具有相同对象的两个相同的词典将具有不同的哈希码.
您需要将您的调整GetHashCode()
设置为不包含字典或使其更复杂,以获取字典中每个键和值的哈希码并将其添加.