有三种比较方法

方法一:比较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. 16、Docker的网络-host和none

    16.1 none   创建一个容器使用网络none: [root@docker ~]# docker run -d --name test1 --network none busybox /bin/ ...

  2. 查看sql server数据库连接数的三种方法

    怎样才能查看sql server数据库连接数呢?下面就将为您介绍三种查看的方法,供您参考,希望能够帮助到您. 1.通过系统的“性能”来查看:开始->管理工具->性能(或者是运行里面输入 m ...

  3. 关于Unity中的NavMeshAgent的remainingDistance问题

    Unity中的NavMeshAgent的remainingDistance问题 在Unity官方案例中,要让某个人物移动到某个地方,一般来说都是下面这样的代码: agent.SetDestinatio ...

  4. C#时间加减

    DateTime dt =......//减数DateTime dt_n = DateTime.Now;//被减数 long x = dt .ToFileTime();//表示自协调世界时 (UTC) ...

  5. C#获取微信二维码显示到wpf

    微信的api开放的二维码是一个链接地址,而我们要将这个二维码显示到客户端.方式很多,今天我们讲其中一种. /// <summary> /// 获取图片路径 /// </summary ...

  6. c# 字符串去掉两端空格,并且将字符串中多个空格替换成一个空格

    字符串去掉两端空格,并且将字符串中多个空格替换成一个空格: 主要还是考察使用字符串的方法: trim(); 去掉字符串两端空格 split(); 切割 string.join(); 连接 class ...

  7. Linux中目录proc/net/dev详解

    在Linux系统中,系统调用是操作系统提供给应用程序使用操作系统服务的重要接口,但同时也正是通过系统调用机制,操作系统屏蔽了用户直接访问系统内核的可能性.幸运的是Linux提供了LKM机制可以使我们在 ...

  8. IT和非IT人士:2分钟了解什么是区块链

    本文由  网易云发布. (非IT:阅读常规部分:IT:阅读引用块) 作者:任长存,网易杭州研究院工程师 前言 信息的高速发展,致使互联网风口犹如娱乐圈,移动互联网,微博.直播.共享经济.短视频.小程序 ...

  9. Kotlin 基本语法

    常量 val a: Int = 5 变量 var a: Int = 5 Any:匹配任何类型 ?:nullable,比如 a?.toString,如果 a 为 null 不会出错. 函数基本结构 fu ...

  10. Django + DRF + Elasticsearch 实现搜索功能

    django使用haystack来调用Elasticsearch搜索引擎  如何使用django来调用Elasticsearch实现全文的搜索 Haystack为Django提供了模块化的搜索.它的特 ...