Solidity By Example 是一个学习 Solidity 编程语言的网站。本页面介绍了哈希函数以及如何在 Solidity 中使用它们。
哈希函数将任意长度的数据转换为固定长度的输出,该输出称为哈希值。哈希函数具有以下属性:
- 输入相同,则输出始终相同。
- 输入略微不同,则输出完全不同。
- 不可能从哈希值推断出输入数据。
- 不可能更改哈希值,而不改变输入数据。
哈希函数用于保护密码、数字签名和加密货币等应用程序的安全性。
keccak256 是一种 SHA3 变体,用于 Solidity 中的哈希值计算。它将任意长度的输入转换为 256 位哈希值。以下是 Solidity 中 keccak256 的示例用法:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract HashExample {
function hash(string memory _text) public pure returns (bytes32) {
return keccak256(abi.encode(_text));
}
}
SHA-256 是另一种流行的哈希函数,通常用于比特币和其他加密货币中。它将任意长度的输入转换为 256 位哈希值。以下是 Solidity 中 sha256 的示例用法:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract HashExample {
function hash(string memory _text) public pure returns (bytes32) {
return sha256(abi.encode(_text));
}
}
RIPEMD-160 是另一种常见的哈希函数,通常用于比特币和其他加密货币中。它将任意长度的输入转换为 160 位哈希值。以下是 Solidity 中 ripemd160 的示例用法:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract HashExample {
function hash(string memory _text) public pure returns (bytes20) {
return ripemd160(abi.encode(_text));
}
}
以下是使用 keccak256 哈希函数在 Solidity 中实现简单密码保护的示例:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract PasswordProtected {
bytes32 private passwordHash;
event PasswordSet(bytes32 passwordHash);
constructor() {
passwordHash = keccak256(abi.encodePacked("myPassword123"));
}
function setPassword(string memory _password) public {
passwordHash = keccak256(abi.encodePacked(_password));
emit PasswordSet(passwordHash);
}
function checkPassword(string memory _password) view public returns(bool) {
bytes32 hashedPassword = keccak256(abi.encodePacked(_password));
return hashedPassword == passwordHash;
}
}
以上示例代码实现了一个简单的密码保护合约,允许用户设置密码并检查密码是否正确。
哈希函数是保护密码、数字签名和加密货币等应用程序安全的重要组件。使用 Solidity 中提供的 keccak256、sha256 和 ripemd160 函数,可以在以太坊智能合约中安全地计算哈希值。