我不熟悉散列算法以及使用它们时相关的风险,因此对我在上一个问题中收到的以下答案有疑问。. .
基于哈希值在编码为 ASCII 时必须适合 16 个 ASCI 字符的注释,解决方案是首先选择一些加密哈希函数(SHA-2 系列包括 SHA-256、SHA-384 和 SHA- 512)然后,将所选散列函数的输出截断为 96 位(12 个字节)——即保留散列函数输出的前 12 个字节并丢弃剩余的字节,然后对截断的输出进行 base-64 编码到 16 个 ASCII 字符(128 位),有效地产生 96 位强加密散列。
如果我将 base-64 编码的字符串子串为 16 个字符,那么保留散列函数的前 12 个字节,然后对它们进行 base-64 编码,这是根本不同的吗?如果是这样,有人可以解释(提供示例代码)截断字节数组吗?
我针对 36,000 多个不同的值测试了完整哈希值的子字符串,并且没有发生冲突。下面的代码是我当前的实现。
感谢您提供的任何帮助(和清晰度)。
public static byte[] CreateSha256Hash(string data)
{
byte[] dataToHash = (new UnicodeEncoding()).GetBytes(data);
SHA256 shaM = new SHA256Managed();
byte[] hashedData = shaM.ComputeHash(dataToHash);
return hashedData;
}
public override void InputBuffer_ProcessInputRow(InputBufferBuffer Row)
{
byte[] hashedData = CreateSha256Hash(Row.HashString);
string s = Convert.ToBase64String(hashedData, Base64FormattingOptions.None);
Row.HashValue = s.Substring(0, 16);
}
[原帖] (http://stackoverflow.com/questions/4340471/is-there-a-hash-algorithm-that-produces-a-hash-size-of-64-bits-in-c)