如何在C#或VB.NET中获取32字节长度的SHA256数据输出
问题原因分析
- SHA256算法的原始计算结果固定为32字节,你代码中
result变量本身就是符合要求的32字节哈希值,你觉得结果不对是因为最终返回的是十六进制编码后的字符串,而非原始字节数组。每个字节会被转为2位十六进制字符,因此最终得到的字符串长度为64,对应的字符串本身的存储字节数自然不是32,属于正常逻辑。 - 你初始化
StringBuilder时指定容量为32属于冗余写法,StringBuilder会自动扩容到所需的64字符容量,不会影响结果但可以优化修正。 - 输入字符串转字节时你使用了UTF32编码,若你需要和其他默认使用UTF8编码的系统做哈希结果对齐,建议将编码改为
Encoding.UTF8。
修正方案
场景1:需要获取原始32字节哈希值
public static byte[] sha256_hash_raw(string value) { using (SHA256 hash1 = SHA256.Create()) { Encoding enc = Encoding.UTF8; // 可根据实际需求调整编码 return hash1.ComputeHash(enc.GetBytes(value)); } }
场景2:需要获取十六进制格式的哈希字符串
该场景下得到64位长度的字符串属于正常结果,优化后的代码如下:
public static string sha256_hash_hex(string value) { StringBuilder sb = new StringBuilder(64); // 修正容量为实际需要的64 using (SHA256 hash1 = SHA256.Create()) { Encoding enc = Encoding.UTF8; // 可根据实际需求调整编码 byte[] result = hash1.ComputeHash(enc.GetBytes(value)); foreach (byte b in result) { sb.Append(b.ToString("x2")); // 直接用小写x2无需再调用ToLower() } } return sb.ToString(); }
内容的提问来源于stack exchange,提问作者user17570829
相关产品推荐
相关产品推荐

