哈希函数(hash function)是一个密码学概念,它可以将任意长度的消息转换为一个固定长度的值,这个值也称作哈希(hash)。
solidity
最常用的哈希函数keccak256
Hash的应用
- 生成数据唯一标识
- 加密签名
- 安全加密
Keccak256
Keccak256
函数是solidity
中最常用的哈希函数,用法非常简单:
哈希 = keccak256(数据);
生成数据唯一标识
我们可以利用keccak256
来生成一些数据的唯一标识。比如我们有几个不同类型的数据:uint
,string
,address
,我们可以先用abi.encodePacked
方法将他们打包编码,然后再用keccak256
来生成唯一标识:
function hash(
uint _num,
string memory _string,
address _addr
) public pure returns (bytes32) {
return keccak256(abi.encodePacked(_num, _string, _addr));
}
我们通常使用 abi.encodePacked 打包所有数据,然后再进行 keccak256 哈希。
但是,我们使用 abi.encodePacked 要非常小心,当将多个动态数据类型传递给 abi.encodePacked 时,可能会发生哈希冲突。
abi 编码函数除了 abi.encodePacked 外,还有函数 abi.encode。 abi.encodePacked 只是将参数转为 16 进制,再直接进行拼接,而 abi.encode 需要先进行补零 ,再进行转码拼接
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Hash { function encode1() external pure returns(bytes memory){ return abi.encodePacked("aa","bb"); } function encode2() external pure returns(bytes memory){ return abi.encodePacked("aab","b"); } }
两个方法返回的内容都是0x61616262,但两者的输入参数并不同。在这种情况下,您应该使用 abi.encode 代替。
或者使用 encodePacked,但是在两个参数之间再添加一个固定数字参数即可
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; contract Hash { function encode1() external pure returns(bytes memory){ return abi.encodePacked("aa",uint(1),"bb"); } function encode2() external pure returns(bytes memory){ return abi.encodePacked("aab",uint(1),"b"); } }