title: 28. Hash tags: solidity advanced wtfacademy hash WTF Solidity极简入门: 28. Hash 我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。 推特:@0xAAScience|@WTFAcademy 社区:Discord|微信群|官网 wtf.academy 所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity 哈希函数(hash function)是一个密码学概念,它可以将任意长度的消息转换为一个固定长度的值,这个值也称作哈希(hash)。
title: 28. Hash tags: - solidity - advanced - wtfacademy - hash
我最近在重新学 Solidity,巩固一下细节,也写一个“WTF Solidity极简入门”,供小白们使用(编程大佬可以另找教程),每周更新 1-3 讲。
所有代码和教程开源在 github: github.com/AmazingAng/WTF-Solidity
哈希函数(hash function)是一个密码学概念,它可以将任意长度的消息转换为一个固定长度的值,这个值也称作哈希(hash)。这一讲,我们简单介绍一下哈希函数及在Solidity的应用。
一个好的哈希函数应该具有以下几个特性:
x,找到另一个消息x',使得hash(x) = hash(x')是困难的。x和x',使得hash(x) = hash(x')是困难的。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)); }
我们用keccak256演示一下之前讲到的弱抗碰撞性,即给定一个消息x,找到另一个消息x',使得hash(x) = hash(x')是困难的。
我们给定一个消息0xAA,试图去找另一个消息,使得它们的哈希值相等:
// 弱抗碰撞性 function weak( string memory string1 )public view returns (bool){ return keccak256(abi.encodePacked(string1)) == _msg; }
大家可以试个10次,看看能不能幸运的碰撞上。
我们用keccak256演示一下之前讲到的强抗碰撞性,即找到任意不同的x和x',使得hash(x) = hash(x')是困难的。
我们构造一个函数strong,接收两个不同的string参数string1和string2,然后判断它们的哈希是否相同:
// 强抗碰撞性 function strong( string memory string1, string memory string2 )public pure returns (bool){ return keccak256(abi.encodePacked(string1)) == keccak256(abi.encodePacked(string2)); }
大家可以试个10次,看看能不能幸运的碰撞上。
部署合约查看唯一标识的生成结果

验证哈希函数的灵敏性,以及强、弱抗碰撞性

这一讲,我们介绍了什么是哈希函数,以及如何使用Solidity最常用的哈希函数keccak256。