Keccak-256 哈希计算器

用以太坊使用的 Keccak-256 对文本或原始字节做哈希,并与 SHA3-256 和 SHA-256 对比。结果随输入实时更新;前四个字节就是 Solidity 函数选择器。

由浏览器中的 JavaScript 计算。地址绝不会被上传或存储。

什么是 Keccak-256?

Keccak-256 是以太坊随处使用的 256 位海绵结构哈希函数:地址是公钥 Keccak-256 哈希的最后 20 字节,函数选择器是规范签名 Keccak-256 哈希的前 4 字节,事件主题、EIP-55 校验和以及存储槽也都由它派生。它是最初提交的 Keccak 版本,与 NIST 最终定稿的 SHA3-256 仅在填充字节上不同,因此同一输入会得到不同的摘要。

典型用途

测试向量

输入Keccak-256
(空)0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
abc0x4e03657aea45a94fc7d47ba826c8d667c0d1e6e33a64a036ec44f58fa12d6c45
Transfer(address,address,uint256)0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef

在依赖本实现之前,可以粘贴以上任意一条来验证结果。

Keccak-256、SHA3-256 与 SHA-256 的区别

函数家族填充 / 结构使用方
Keccak-256Keccak 海绵结构,速率 1088 位pad10*1,域分隔字节 0x01以太坊、Tron(TVM)、所有 EVM 链
SHA3-256Keccak 海绵结构,速率 1088 位pad10*1,域分隔字节 0x06(FIPS 202)NIST 应用、部分非 EVM 链
SHA-256Merkle–Damgård(SHA-2)长度填充,512 位分组比特币、Tron txID、TLS、Base58Check

举例:在 FIPS 202 库中对 abc 计算 SHA3-256 得到 0x3a985da74fe225b2045c172d6bd390bd855f086e3e9d525b46bfe24511431532,而同样三个字节的 Keccak-256 则是上表中的 0x4e03657a…。如果合约或区块浏览器中的值与你的库不一致,首先应检查填充字节。

常见问题

Keccak-256 和 SHA3-256 是一回事吗?

不是。以太坊在 NIST 定稿 SHA-3 之前就采用了 Keccak,而最终标准修改了填充字节(Keccak 为 0x01,SHA3 为 0x06)。两者对同一输入会产生不同输出,这也是 web3 库把该函数命名为 keccak256 而非 sha3 的原因。本页同时显示两者,方便你对比差异。

以太坊用 Keccak-256 做什么?

由公钥推导地址(哈希的最后 20 字节)、函数选择器和事件主题(签名的哈希)、EIP-55 校验和、mapping 的存储槽计算、Merkle-Patricia 树节点,以及区块哈希和交易哈希。

我应该按文本还是按十六进制哈希?

签名和普通字符串选 UTF-8 文本。手头是原始字节时选十六进制,例如非压缩公钥或 ABI 编码数据;0x 前缀可有可无。对文本 "0xabcd" 和字节 0xabcd 哈希得到的结果并不相同。

哈希是在你们的服务器上计算的吗?

不是。Keccak、SHA3 和 SHA-256 均由本页面的 JavaScript 实现,在你的浏览器中运行。页面加载完成后不会发出任何网络请求。

空字符串的 Keccak-256 是多少?

0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470。它在以太坊中随处可见:所有没有代码的账户的代码哈希都是这个值,因此区块浏览器会在普通钱包地址上显示它。

可以在这里验证比特币相关的值吗?

本页包含 SHA-256,可以对数据做单次哈希。比特币的双重 SHA-256 和 RIPEMD-160 没有作为单独输出提供,但比特币地址验证器在校验地址时会在内部执行这些运算。