やりたいこと
- 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