这是结合MD5哈希的好方法吗?

时间:2013-10-13 14:05:01

标签: c# md5

我有一个数据树,如果一个节点发生了变化,我需要将这些变化反映在节点的散列及其父节点中。哈希值。虽然这种方法可能不适合军用级加密,但它适合这项简单的任务吗?我不太了解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,我可以使用大锤来破解墙上的坚果。

谢谢,

0 个答案:

没有答案