64个字节相同,但==返回false。我猜测编码可能有问题,但我无法弄清楚我做错了什么。有什么想法来解决这个问题吗?
float
我用一个简单的值来测试它,因为它们都调用相同的哈希方法,所以除了编码中的某些东西之外,我看不出它是如何失败的。我只是使用内置的System.Security.Cryptography。
答案 0 :(得分:6)
在C#中,如果两个数组相同,则它们仅等于另一个数组,即它们是完全相同的数组。正常的相等比较不会检查这些数组的内容是否相等:
byte[] x = new byte[] { 1, 2, 3 };
byte[] y = new byte[] { 1, 2, 3 };
Console.WriteLine(x == y); // false
您可以使用Enumerable.SequenceEqual
检查内容是否相同:
Console.WriteLine(x.SequenceEqual(y)); // true
由于SHA512哈希值通常以十六进制显示,因此实际返回十六进制字符串而不是字节数组可能是有意义的。您可以使用其中一个many ways to convert a byte array into a hex string。然后,您可以对字符串执行相等检查 - 这将按预期工作。
答案 1 :(得分:4)
不,编码没有问题 - 在byte[]
中没有编码。他们只是字节。对于执行参考比较的数组,==
只是一个问题。
您可以使用SequenceEqual
来比较数组:
public static bool Validate(string enteredValue, byte[] hashedValue)
{
// TODO: Rename `hashSHA512 to follow .NET naming conventions
byte[] hash = hashSHA512 (enteredValue);
return hash.SequenceEqual(hashedValue);
}
请注意,您的using指令中需要using System.Linq;
来引入LINQ。
备选方案:
SequenceEqual