データのツリーがあり、ノードが変更された場合、その変更をノードのハッシュとその親のハッシュに反映させる必要があります。この方法は軍用グレードの暗号化には適していないかもしれませんが、この単純なタスクには適していますか? 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 の 1 つのインスタンスを作成して渡しているだけであることがわかります。ここで MD5 の代わりに CRC32 のようなものを使用することもできますが、それはより高速で優れたソリューションでしょうか? MD5 を使用すると、ことわざにあるように、スレッジ ハンマーを使用してクルミを割っているような気がします。
ありがとう、
ジョー