Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
11
Help us understand the problem. What are the problem?

More than 1 year has passed since last update.

@SogoK

Google Spreadsheetでハッシュ関数を使う

やりたいこと

  • Google SpreadsheetでMD5やSHA256などのハッシュ関数を使う

方針

基本的にこのStackoverflowの質問(Hash of a cell text in Google Spreadsheet)に従ってやれば良いのだが、非ASCIIの文字列で少しつまずいたので日本人としてメモ。

実装

ハッシュ関数を使いたいシートで、シート>スクリプトエディタを開く。
スクリプトエディタに下記の関数を貼り付けて保存。

function MD5(input) {
  var rawHash = Utilities.computeDigest(Utilities.DigestAlgorithm.MD5, input, Utilities.Charset.UTF_8);
  var txtHash = '';
  for (i = 0; i < rawHash.length; i++) {
    var hashVal = rawHash[i];
    if (hashVal < 0) {
      hashVal += 256;
    }
    if (hashVal.toString(16).length == 1) {
      txtHash += '0';
    }
    txtHash += hashVal.toString(16);
  }
  return txtHash;
}

付け加えたのは第3引数のUtilities.Charset.UTF_8で、これがないと非ASCII文字は全部同じ文字として扱われてしまう。

hashVal += 256しているのはUtilities.computeDigest関数が-128から127までの数値を要素に持つbyte arrayを返すので、マイナスでなくするために足しています。マイナスのままhashVal.toString(16)してしまうと値に-がついてしまう(例:-30.0 -> -1e)からで、別に256でなく128を足すのでも良いようです。
試しにPythonのhashlibでhexdigest()してみたら、上の関数で256を足して作った値と等しかったので、そういうもんなんだな〜とざっくり理解しました。

SHA256とか他のアルゴリズムを使うなら

Utilities.DigestAlgorithm.MD5の部分を好きなアルゴリズムに変えてください。
使えるアルゴリズムはこちらのリファレンスを参照。

プロパティ アルゴリズム
MD2 MD2
MD5 MD5
SHA_1 SHA-1
SHA_256 SHA-256
SHA_384 SHA-384
SHA_512 SHA-512

まんますぎて何のための表だかわかりません。

使い方

普通の関数と同じように=MD5("hogehuga")=MD5(A1)のようにして使えます。

MD5は暗号としての目的には使えませんが、=MD5(A1&B1&C1)のようにして複数の値を束ねたユニークな値を作りたくて使いました。シートには行を追加したり削除したりするので、番号を振るかわりにそのレコードだと一意に定まる値が得られて便利です。
同じハッシュがあったときに条件付き書式で色が変わるようにしておけば、うっかり同じものを2箇所に書いてしまうことも防げます。

こんな需要がどれだけあるか知りませんが、スプレッドシートでやれることがまた一つ増えましたね。

参考文献

Hash of a cell text in Google Spreadsheet
Class Utilities - computeDigest(algorithm, value, charset)
Enum DigestAlgorithm

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
11
Help us understand the problem. What are the problem?