Solidity - 使用hash值和使用字节长度判断字符串哪个方法比较省Gas

本文探讨了在以太坊智能合约中,通过`Strings`库实现字符串相等性和空值判断的两种方法——基于哈希和字节长度,分析了不同长度字符串的 gas 消耗,揭示了使用哈希值判断更节省gas。

合约代码

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.7;


/**
 * @dev String operations.
 */
library Strings {

    /// @dev 比较2个字符类型是否相等
    function isEqual(string memory strLeft, string memory strRight) internal pure returns(bool) {
        bytes32 hashLeft = keccak256(abi.encode(strLeft));
        bytes32 hashRight = keccak256(abi.encode(strRight));

        return ( hashLeft == hashRight );
    }
}

/// @dev 测试
contract TestStringGas {
    string name;

    using Strings for string;

    /// @dev 使用hash值判断字符串是否为空
    function StringsEqual(string memory _name) external {
        require(!_name.isEqual(""), "The value is empty.");
        name = _name;
    }

    /// @dev 使用字符串的字节长度判断是否为空
    function bytesEqual(string memory _name) external {

        require(bytes(_name).length != 0, "The value is empty.");
        name = _name;
    }
}

测试结果

使用Remix浏览器及MetaMask进行测试得出的结果,比较结果整体来看是使用hash值方法判断字符串比较省gas,如下所示:

输入字符(字符数)

lib Strings

(Total)

gas used

bytes(string).length

(Total)

gas used
1 (1)0.00006928(少)

27710

(少)

0.0001113644543
tracy (5)0.0000694(少)27758

(少)

0.0000743529740
"hi, i am tracy" (14)0.00006967(少)27866

(少)

0.0000746229848
"hi, i am tracy. Today is summy"(30)0.00007015(少)28058

(少)

0.000075130040
"hi, i am tracy. Today is summy. We are going to play games"(57)

0.00007731

(少)

30925

(少)

0.0001815872633
"hi, i am tracy. Today is summy. We are fine"(42)0.00007686(少)30745

(少)

0.000088635439
1 (1)0.00006928(少)27710

(少)

0.0000750630022
0x5B9cb96fE1088F87D49a206B2cb50b70dD0A0cf9 (42)0.00007683(少)30733

(少)

0.000181172441
0x56dcb5e2883913947914f158a2df8c50ea297b7aa355e3bc8885f27de3e3da38(66)0.00008378(少)33513(少)0.0001520560819
"中文"0.00006943(少)27770(少)0.0001115144603
"南京票据证券印刷有限公司"0.00007665(少)30661(少)0.0001809272369
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值