You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何Python不同模块中SHA3哈希计算结果存在差异?

为什么Python的hashlib.sha3_256和sha3模块的计算结果不一致?

这其实是个很容易踩坑的混淆点——你调用的根本不是同一个算法!

核心差异:SHA-3 vs 原始Keccak

Keccak是SHA-3竞赛的最终获胜算法,但在NIST将其标准化为正式SHA-3标准时,做了一处关键的规则修改:

  • 原始Keccak算法使用的填充规则是01:在消息末尾添加0x01字节,再补0到块大小
  • NIST标准化后的SHA-3使用的填充规则是10*1:最后一个字节是0x80,前面补0到块大小

你的测试代码里:

  • sha3.keccak_256()调用的是原始Keccak-256算法
  • hashlib.sha3_256()调用的是NIST标准化后的SHA-3-256算法

这就是两者结果完全不同的本质原因。

直观验证示例

用同一个字符串测试,就能清晰看到差异:

import sha3
import hashlib

test_str = "hello world"

# 原始Keccak-256(sha3模块)
k = sha3.keccak_256()
k.update(test_str.encode('utf-8'))
print("Keccak-256结果:", k.hexdigest())
# 输出:47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad

# NIST SHA-3-256(hashlib)
h = hashlib.sha3_256()
h.update(test_str.encode('utf-8'))
print("SHA-3-256结果:", h.hexdigest())
# 输出:644bcc7e564373040999aac89e7622f3ca71fba1d972fd94a31c3bfbf24e3938

如何得到一致的结果?

如果你需要和sha3模块的Keccak结果(或网络上多数Keccak工具)对齐,在Python 3.8+的hashlib中已经支持直接调用Keccak算法了:

# Python 3.8+ 可用
h = hashlib.new('keccak_256')
h.update(test_str.encode('utf-8'))
print("hashlib Keccak-256结果:", h.hexdigest())
# 输出和sha3.keccak_256完全一致:47173285a8d7341e5e972fc677286384f802f8ef42a5ec5f03bbfa254cb01fad

如果你的Python版本低于3.8,继续使用sha3模块的keccak_256就是正确的选择。

内容的提问来源于stack exchange,提问作者Alex G.P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:59:33