有三种比较方法

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

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

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

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;
}

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

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

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

在remix上执行也可以看到gas情况,但感觉不准,这里的统计参考:https://blog.csdn.net/xiaomei1xiake2/article/details/81868317

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

五.在实际应用中,可以AOP方式,也可以在函数中直接判断

pragma solidity ^0.4.24;

contract StringComp {

    mapping (address => bool) public compareRecord;

    bool public checkResult = false;

    modifier check(string _str1,string _str2) {
require(keccak256(abi.encodePacked(_str1)) == keccak256(abi.encodePacked(_str2)));
_;
} // 使用AOP方式check比较两个字符串
function func1 (string __str1, string __str2) public check(__str1,__str2) returns(bool) {
// 保存调用者的比较结果
compareRecord[msg.sender] = true;
} // 函数中直接判断
function compareStr (string _str1, string _str2) public returns(bool) {
if(keccak256(abi.encodePacked(_str1)) == keccak256(abi.encodePacked(_str2))) {
// 如果二者相等,使checkResult为true
checkResult = true;
}else {
checkResult = false;
}
// 返回checkResult
return checkResult;
}
}

在这里,有直接用abi.encodePacked进行打包,关于abi.encodePacked方法说明,详见如下:

详见:https://solidity.readthedocs.io/en/v0.4.24/units-and-global-variables.html

五.特别说明

keccak256方法在0.4.2及其下版本不支持,至少需0.4.3版本。

附:在remix上运行截图

1.StrComp.sol

pragma solidity ^0.4.24;

contract StrComp {

    function hashCompareInternal(string a, string b) public returns (bool) {
return keccak256(a) == keccak256(b);
} function utilCompareInternal(string a, string b) public 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;
} function hashCompareWithLengthCheckInternal(string a, string b) public returns (bool) {
if (bytes(a).length != bytes(b).length) {
return false;
} else {
return keccak256(a) == keccak256(b);
}
}
}

2.StringComp.sol

pragma solidity ^0.4.24;

contract StringComp {

    mapping (address => bool) public compareRecord;

    bool public checkResult = false;

    modifier check(string _str1,string _str2) {
require(keccak256(abi.encodePacked(_str1)) == keccak256(abi.encodePacked(_str2)));
_;
} // 使用AOP方式check比较两个字符串
function func1 (string __str1, string __str2) public check(__str1,__str2) returns(bool) {
// 保存调用者的比较结果
compareRecord[msg.sender] = true;
} // 函数中直接判断
function compareStr (string _str1, string _str2) public returns(bool) {
if(keccak256(abi.encodePacked(_str1)) == keccak256(abi.encodePacked(_str2))) {
// 如果二者相等,使checkResult为true
checkResult = true;
}else {
checkResult = false;
}
// 返回checkResult
return checkResult;
}
}

参考文章:https://blog.csdn.net/xiaomei1xiake2/article/details/81868317

https://www.liankexing.com/index.php/Question/question_page.html?id=1249

https://solidity.readthedocs.io/en/v0.4.24/units-and-global-variables.html

String Equality Comparison

String patterns github

remix地址:https://remix.ethereum.org/

Solidity两个string的比较的更多相关文章

  1. 取两个String数组的交集

    import org.testng.annotations.Test; import java.util.HashMap; import java.util.LinkedList; import ja ...

  2. js比较两个String字符串找出不同,并将不同处高亮显示

    根据java代码改写成js,下边js文件代码: function StringBuffer() { this.__strings__ = []; }; StringBuffer.prototype.a ...

  3. 对比两个String无规律包含连续4个相同字符返回true的方法

    package com.qif.dsa.util; import java.util.ArrayList; import java.util.List; /** * @author * @Title: ...

  4. 如何判断两个String是否是Anagrams_java实现

    Anagrams:是颠倒字母顺序的字符串 本文提供三个方法,分别分析时间空间复杂度 方法一:暴力遍历 时间复杂度:O(n^2) 方法二:基于排序算法,Sorting的时间复杂度是O(n*log(n)) ...

  5. 两个string数组对应比较

    最近做的array string类型对比.这个可能比较复杂,用的是linq 是请教别人的,我在这里记录一下 jquery 方法里面的数组 function arrtxt() { var arrt= [ ...

  6. c++实现一个比较两个string类型的版本号的小demo

    在软件实现更新模块的时候,有可能会判断一下服务器上的版本的版本号和本地版本的版本号. 下面有类似这样形式的版本号:string str = "0.0.0.1"; 分析一下可以看出, ...

  7. 计算两个String 类型的时间相关几个月

    /** * 返回两个时间段相隔几个月 * @param date1 * @param date2 * @return * @throws ParseException * @throws ParseE ...

  8. 找两个string[ ]里不同的元素

    方法 1:string[] strListOne = new string[] {"Type", "Parent Id","Status"} ...

  9. Java实现交换两个String

    在Java中我们所使用的实例变量其实都是一个引用,所以如果要求实现一个swap(String A, String B)这种函数时无法实现的,因为在类方法的定义中是先对行参进行地址传递,然后对形参修改, ...

随机推荐

  1. ViewGroup onInterceptTouchEvent,ViewGroup onTouchEvent,View onTouchEvent执行顺序说明

    今天抽出了一些时间实践了viewgroup和view的触摸事件顺序,之前也试过,总是忘记,今天记下笔记说明一下 首先 onInterceptTouchEvent只会出现在viewgroup中,view ...

  2. spring aop方式配置事务中的三个概念 pointcut advice advisor

    AOP的3个关键概念 因为AOP的概念难于理解,所以在前面首先对Java动态代理机制进行了一下讲解,从而使读者能够循序渐进地来理解AOP的思想. 学习AOP,关键在于理解AOP的思想,能够使用AOP. ...

  3. DelphiXE10.2怎么安装文本转语音(TTS)语音转文本(SR)控件(XE10.2+WIN764)

    关资料: http://edn.embarcadero.com/article/29583 http://blog.sina.com.cn/s/blog_53866d7501017r1o.html 问 ...

  4. 取得 APP 自己的版本号 (跨 4 个平台)

    http://www.cnblogs.com/onechen/p/3627942.html XE7 源码下载:[原创]取得APP自己的版本号(狠跨4个平台)XE7.zip XE6 源码下载:[原创]取 ...

  5. TCP协议通讯流程

    刚才网上找到的,觉得挺详细的,转来. tcp连接的三次握手大家肯定都熟了,可是有的人不一定对tcp断开的四次握手也很熟悉. 我在园子里面找到一张图,介绍的很好,现在转来!(该图片原博客地址:http: ...

  6. AJPFX的监管与执照

      AJPFX受到英国金融行为监管局(FCA)授权和监管. 英国FCA是目前世界上金融服务最完善.最健全的监管机构,英国FCA对所有在其境内注册的金融服务机构进行严格的监管. 英国金融行为监管局(FC ...

  7. Ubuntu16.04 - 安装Courier New字体

    这应该是一个很简单的任务吧?网上很多地方告诉我们,只要在shell终端里面执行命令:"sudo apt-get installttf-mscorefonts-installer"就 ...

  8. 【2019年OCP新题】OCP题库更新出现大量新题-11

    11.Your database is in archivelog mode. You want to disable archiving for the database. Examine thes ...

  9. CRUD组件的高阶使用

    1.list页面自定列显示: class PermissionConfig(sites.AryaConfig):       def dabo(self, obj=None, is_header=Fa ...

  10. jQuery基础笔记 事件(6)

    day56 参考:https://www.cnblogs.com/liwenzhou/p/8178806.html#autoid-1-9-6 事件 *****         1. 目前为止学过的绑定 ...