You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动