我试图使用GetHashCode()
值来确定一个对象在通过ASP.NET MVC应用程序中的ajax调用进行验证后是否发生了更改。但是,我注意到这并不奏效,因为在验证期间返回时的哈希码值与在验证请求之后从另一个请求中的模型绑定重新创建对象时生成的哈希码不同。我能够通过创建一个SHA哈希来解决这个问题,但我很好奇我为什么看到这种行为。GetHashCode()为相同的对象值返回不同的值
我知道从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 Dictionary<string, string> DispositionInfo { 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;
}
}
}
啊!这就说得通了! * Smacks头对着办公桌* – JNYRanger
我会更倾向于排除字典,GetHashCode应该是一个快速返回的函数,如果大的话可能会很慢,通过整个字典。 –
它很少会有超过20个键值对,但我需要包含它,因为我使用它来确保没有任何变化(包括字典中的键值对)是使用哈希码的目的。对它进行序列化并生成一个SHA-1哈希值就是个诀窍。不是性能最快的方法,但速度足以满足其使用目的。 – JNYRanger