我有一个数据树,如果一个节点发生了变化,我需要将这些变化反映在节点的散列及其父节点中。哈希值。虽然这种方法可能不适合军用级加密,但它适合这项简单的任务吗?我不太了解MD5如何在内部工作,我不确定是否将其转换为32位整数会削弱它。
[DataMember(Name = "hash")]
public string Hash
{
get
{
// We convert this to a base64 string because it goes over the wire as text not an int and base64 takes up less space than 0-9
return Convert.ToBase64String(BitConverter.GetBytes(GetRecursiveHashCode())).Trim("=".ToCharArray());
}
set { } // We need a setter or the property doesn't appear in the JSON
}
private MD5 _md5 = null;
private int _recursiveHashCode;
private int GetRecursiveHashCode()
{
return GetRecursiveHashCode(_md5 ?? MD5.Create());
}
private int GetRecursiveHashCode(MD5 md5)
{
if (_md5 == null)
_md5 = md5;
unchecked
{
if (_recursiveHashCode == 0)
{
_recursiveHashCode = this.GetHash(md5);
if (Children != null)
{
foreach (var child in Children)
{
_recursiveHashCode = _recursiveHashCode * 31 + child.GetRecursiveHashCode(md5);
}
}
}
return _recursiveHashCode;
}
}
public int GetHash(MD5 md5)
{
unchecked
{
string text = (ContextMenu ?? string.Empty) + "~" + HasChildren + "~" + Id + "~" + IsFolder + "~" + IsSystemFolder + "~" + Ordinal + "~" + HasChildren + "~" + SmallIcon + "~" + Title + "~" + Tooltip;
return BitConverter.ToInt32(md5.ComputeHash(Encoding.Default.GetBytes(text)), 0);
}
}
我还想知道MD5.Create是否非常耗费资源?您会注意到,在上面的代码中,我只创建一个MD5实例并传递它。我可以在这里用CRC32代替MD5,这会是一个更快/更好的解决方案吗?我觉得通过使用MD5,我可以使用大锤来破解墙上的坚果。
谢谢,
乔