第一次写博客,希望记录自己的学习过程,也可以跟大家一起分享,坚持!
本文翻译自: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的数量呈线性增长。