我有一个数据树,如果一个节点发生变化,我需要将这些变化反映在节点的哈希及其父节点的哈希中。虽然这种方法可能不适合军用级密码学,但它适合这个简单的任务吗?我不太了解 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 就像俗话说的那样,我是在用大锤敲碎胡桃。
谢谢,
乔