.NET SHA256与Object.GetHashCode()的区别

4

在使用SHA256和Object.GetHashCode()时,各有优缺点。

下面的代码中,两种方法的输出结果相同,然而GetHashCode()方法更简单,需要较少的对象/代码。

class Program
    {
        static void Main(string[] args)
        {
            TestGetHashCode();
            TestSha256();
            Console.Read();
        }

        static void TestSha256()
        {
            Console.WriteLine("Testing SHA256");
            UnicodeEncoding byteConverter = new UnicodeEncoding();
            SHA256 sha256 = SHA256.Create();
            string data = "A paragraph of text";
            byte[] hashA = sha256.ComputeHash(byteConverter.GetBytes(data));
            data = "A paragraph of changed text";
            byte[] hashB = sha256.ComputeHash(byteConverter.GetBytes(data));
            data = "A paragraph of text";
            byte[] hashC = sha256.ComputeHash(byteConverter.GetBytes(data));
            Console.WriteLine(hashA.SequenceEqual(hashB)); // Displays: false
            Console.WriteLine(hashA.SequenceEqual(hashC)); // Displays: true
        }

        static void TestGetHashCode()
        {
            Console.WriteLine("Testing Object.GetHashCode()");
            string data = "A paragraph of text";
            int hashA = data.GetHashCode();
            data = "A paragraph of changed text";
            int hashB = data.GetHashCode();
            data = "A paragraph of text";
            int hashC = data.GetHashCode();
            Console.WriteLine(hashA.Equals(hashB)); // Displays: false
            Console.WriteLine(hashA.Equals(hashC)); // Displays: true
        }
    }

2
GetHashCode() 的一个硬性要求是它必须快速。这是必不可少的,否则就失去了加速比较的所有好处。SHA256没有这样的要求,实际上当它变慢时更好,因为这也会减缓任何攻击者的速度。 - Hans Passant
4
Object.GetHashCode 在两次应用程序运行之间可能会产生不同的结果。而 SHA-xx 在多次运行中是稳定的,被明确定义,可以跨平台使用。 - Caramiriel
1个回答

4
由于它们被构建用于两种完全不同的目的,因此您无法将二者进行比较。 您的目标是什么?加密还是简单对象查找?
对于对象查找(在哈希表中):GetHashCode()
对于加密:SHA256与例如AES结合使用。
应该覆盖GetHashCode()以适合您的类型,并且理想情况下仅使用不可变字段,即对象的生命周期内不会更改的字段。只读字段是一个很好的例子;-)
例如,SHA256用于散列密码以在取256位密钥的加密算法中使用。 用于加密的散列算法的重点是它必须慢(相反的是对象查找场景),以使暴力攻击密码更加困难。
所以没有优缺点,但真正取决于您的目标。为目的使用正确的工具 :-)

我认为加密与哈希没有任何关系,因此我不看到它们之间的联系。尽管它们都可以用于安全原因。 - Caramiriel
我并没有说加密与加密有关。当然,它们之间没有直接的关系。- 然而,我上面的观点是选择正确的工具来完成工作。选择哈希算法需要知道其目的。加密只是提供了一个例子,而不是直接的关系;-) - Bo Stig Christensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接