// SPDX-License-Identifier: MIT
pragma solidity 0.8.17;
//哈希运算加密的误区例子
// aaa,bbb 与 aa,abbb 运算结果会一致,代码试验看看怎么回事
contract a {
//首先,我们接受两个字符串的参数
function encodePK(string memory str1, string memory str2) external pure returns (bytes32){
return keccak256(abi.encodePacked(str1,str2));
/*
aaa,bbb这里返回的结果是:0x5840157b56d7f5dcd237891d847bd255f3764fde7180351c2c3546b4c7e381f8
aa,abbb结果是:0x5840157b56d7f5dcd237891d847bd255f3764fde7180351c2c3546b4c7e381f8
两者结果一致,但是输入的参数却不是一致的
*/
}
// keccak加密后,返回的是定长32位,所以是bytes32
function encode(string memory str1, string memory str2) external pure returns (bytes32){
return keccak256(abi.encode(str1,str2));
/*
aaa,bbb这里返回的结果是:0x9442fc109939c1323c53a3cb213beb6cdfb43a710c6de6098270610f6b9e15d9
aa,abbb结果是:0x02f379c9d6d924b205efaa7e888b0cb4e1c0dcaf9d7ccc7688981022cc450884
两者结果不一致,说明encode是可以辨别参数的位置的
*/
}
//原因解释
//因为encode返回的是一个不确定的长度,所以给bytes即可,并且要给与一个内存变量声明,不然会报错说typeerror
function noUseKecc(string memory str1, string memory str2) external pure returns (bytes memory){
return abi.encode(str1,str2);
/*
0x00000000000000000000000000000000
0000000000000000000000000000004000
0000000000000000000000000000000000
0000000000000000000000000080000000
0000000000000000000000000000000000
0000000000000000000000026161000000
0000000000000000000000000000000000
0000000000000000000000000000000000
0000000000000000000000000000000000
0000000000000004616262620000000000
0000000000000000000000000000000000
000000000000
aa,abbb
0x00000000000000000000000000000000
0000000000000000000000000000004000
0000000000000000000000000000000000
0000000000000000000000000080000000
0000000000000000000000000000000000
0000000000000000000000036161610000
0000000000000000000000000000000000
0000000000000000000000000000000000
0000000000000000000000000000000000
0000000000000003626262000000000000
0000000000000000000000000000000000
000000000000
aaa,bbb
*/
}
function noUseKeccPK(string memory str1, string memory str2) external pure returns (bytes memory){
return abi.encodePacked(str1,str2);
/*
aaa,bbb:0x616161626262
aa,abbb:0x616161626262
*/
}
//两个代码的差别看出来了吗,encode是补0了,而 encodepacked是没有补0的,导致了输出的值会一致,
//解决办法就是在两个字符串之间添加不同类型的值进行加密,比如是一个整数,或者是一个address地址
function encodePack(string memory str1,uint x,string memory str2) external pure returns (bytes32){
return keccak256(abi.encodePacked(str1,x,str2));
}
}