Solidity 两个string的比较

第一次写博客,希望记录自己的学习过程,也可以跟大家一起分享,坚持!
本文翻译自:String Equality Comparison,String patterns github


有三种比较方法:

  • 方法一:比较string的哈希值
  • 方法二:先比较string的长度,再比较每个对应位置的字母是否相同
  • 方法三:先比较string的长度,再比较string的哈希值

1.比较string的哈希值

solidity代码

function hashCompareInternal(string a, string b) internal returns (bool) {
        return keccak256(a) == keccak256(b);
    }

2.先比较string的长度,再比较每个对应位置的字母是否相同

solidity代码

function utilCompareInternal(string a, string b) internal returns (bool) {
        if (bytes(a).length != bytes(b).length) {
            return false;
        }
        for (uint i = 0; i < bytes(a).length; i ++) {
            if(bytes(a)[i] != bytes(b)[i]) {
                return false;
            }
        }
        return true;
    }

3.先比较string的长度,再比较string的哈希值

solidity代码

function hashCompareWithLengthCheckInternal(string a, string b) internal returns (bool) {
        if (bytes(a).length != bytes(b).length) {
            return false;
        } else {
            return keccak256(a) == keccak256(b);
        }
    }

4.三种比较方法的gas分析

Input A Input B 方法一 方法二 方法三
abcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz 1225 7062 1261
abcdefghijklmnopqrstuvwxyX abcdefghijklmnopqrstuvwxyz 1225 7012 1261
Xbcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz 1225 912 1261
aXcdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz 1225 1156 1261
abXdefghijklmnopqrstuvwxyz abcdefghijklmnopqrstuvwxyz 1225 1400 1261
abcdefghijkl abcdefghijklmnopqrstuvwxyz 1225 690 707
a a 1225 962 1261
ab ab 1225 1156 1261
abc abc 1225 1450 1261

由以上的测试可知:

  • 当超过两个字母需要比较的时候,哈希方法(方法一和方法三)消耗的gas比较少;
  • 当这两个string的长度不同时,先进行长度比较(方法二和方法三)可以节省将近40%的gas。
  • 先进行长度比较只是多花了3%的gas,但可能可以节省40%的gas。
  • 与使用字母比较(方法二)的方法相比,使用哈希方法(方法一和方法三)gas的消耗比较稳定。使用字母比较的方法消耗gas的数量呈线性增长。

你可能感兴趣的:(Solidity)