0

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

谢谢,

4

0 回答 0