为什么SHA256输出字符串比特数波动?如何选择SQL Server存储类型
SHA256哈希存储与比特计数误区梳理
核心矛盾根源
你遇到的所有冲突本质是混淆了SHA256原始二进制哈希值和序列化编码后的字符串两个完全不同的概念。
具体问题解答
1. 为什么统计到的比特数不是256?
SHA256算法本身的输出确实是固定256比特(也就是32字节)的原始二进制数据,你统计到的294-303比特波动,是因为计数对象不是原始二进制,而是经过编码后的字符串:你统计的是字符串每个字符的编码比特总和,自然和原始哈希的比特数无关。
2. 为什么字符串长度是44不是32?
你拿到的44位字符串是Base64编码后的结果:Base64编码规则是将每3个字节编码为4个可打印ASCII字符,32字节的原始哈希计算后:向上取整(32 / 3) * 4 = 44,末尾会带1个=填充符,这就是你看到44长度的来源。
如果用另一种常见的十六进制编码,32字节会被转为64个十六进制字符,这也是网上答案差异大的核心原因:不同回答对应的是不同编码后的存储场景。
3. SQL Server数据类型选型建议
- 最优方案:选
BINARY(32),直接存储原始二进制哈希值,没有任何编码冗余,存储空间最小,哈希对比、索引的性能最高,需要展示或传输时再在代码层转成对应格式的字符串即可。 - 如果业务必须存储可打印字符串,按你使用的编码选定长类型:
- 存Base64编码:用
CHAR(44) - 存十六进制编码:用
CHAR(64)
不要用VARCHAR等可变长度类型,哈希长度固定,定长类型的存储和查询性能更好。
- 存Base64编码:用
内容的提问来源于stack exchange,提问作者Jacob Stamm
相关产品推荐
相关产品推荐

