Binary数据类型存储机制探究及SHA256密码比对疑问
关于SHA256在binary(32)字段的存储及C#字节数组匹配的疑问解答
嘿,我来帮你把这两个点讲清楚:
1. binary(32)字段的真实存储方式
你在SELECT语句里看到的0x81B637D8FCD2C6DA6359E6963113A1170DE795E4B725B84D1E0B4CFD9EC58CE9只是数据库给你可视化的十六进制字符串表示,并不是实际存在磁盘上的内容。
真实的存储非常直接:binary(32)字段会把SHA256生成的32个原始字节(每个字节是8位二进制数据)原封不动地存进去,没有任何额外的前缀、编码或者转换。比如哈希结果里的第一个字节如果是十进制的129(对应十六进制的81),数据库里就直接存这个8位的二进制值10000001,完全没有字符串相关的处理。
2. 为什么C# byte数组对比不需要处理0x前缀或大小写
这其实和上面的存储逻辑是对应的:
- 你的C#哈希函数返回的
byte[],就是SHA256计算后得到的原始32字节二进制数据,和数据库binary(32)字段里存的内容完全一致。 - 你看到的
0x前缀和十六进制字符串,只是人类可读的格式转换——数据库把二进制转成十六进制字符串给你看,而C#的byte数组根本不需要做这种转换,它本身就是和数据库存储完全匹配的二进制数据。
举个简单例子:假设哈希后的某一个字节是0xB6(十进制182),数据库里存的就是这个字节值,C#数组里对应的元素也是0xB6。当你用byteArray1.SequenceEqual(byteArray2)对比时,是直接逐字节比较二进制值,自然不需要处理任何字符串格式的东西,匹配起来当然没问题。
内容的提问来源于stack exchange,提问作者Black Panther




