Solidityで文字列を比較する方法について解説します。
構文
Solidityで文字列を比較するには、以下の様にします。
keccak256(abi.encodePacked(文字列1)) == keccak256(abi.encodePacked(文字列2))
また、ABIエンコーディング(abi.encodePacked())ではなく、文字列バイト列変換(bytes())を使った方法でも可能です。
keccak256(bytes(文字列1)) == keccak256(bytes(文字列2))
どちらの方法でも構いませんが、後者の方が、若干だけコスト(ガス代)が安いと思われます。
サンプルコード
// SPDX-License-Identifier: GPL-3.0
pragma solidity >=0.7.0 <0.9.0;
contract Test {
/* ABIエンコーディング(abi.encodePacked())を使用した方法 */
function compareStringsByAbiEncoding(string memory s1, string memory s2) public pure returns(bool){
// 文字列を比較
return keccak256(abi.encodePacked(s1)) == keccak256(abi.encodePacked(s2));
}
/* 文字列バイト列変換(bytes())を使用した方法 */
function compareStringsByBytes(string memory s1, string memory s2) public pure returns(bool){
// 文字列を比較
return keccak256(bytes(s1)) == keccak256(bytes(s2));
}
}
SolidityではEVM(Ethereum Virtual Machine)の都合上、文字列をそのまま扱えないため、abi.encodePacked()やbytes()で文字列をバイト列にしたり、keccak256関数により文字列をハッシュ化したりする必要があります。他のプログラミング言語とは勝手が違い戸惑いますが、徐々に慣れていきましょう。