バイナリのハッシュを計算するには (md5, sha1)

いろいろな言語でMD5やSHA1などのメッセージダイジェストを計算する方法。

Java Scala PHP Python Perl sh

Java

MD5を計算する例

MessageDigest digest = java.security.MessageDigest.getInstance("MD5");
byte[] hash = digest.digest("あいうえお".getBytes("UTF-8"));
StringBuilder hashStr = new StringBuilder();
for (int i = 0, l = hash.length; i < l; i++) {
    int h = hash[i];
    if (h < 0) {
        hashStr.append(Integer.toHexString(h + 256));
    } else {
        if (h < 16) {
            hashStr.append("0");
        }
        hashStr.append(Integer.toHexString(h));
    }
}
System.out.println(hashStr.toString());
// => 86deb27a32903da70a7b2348fcf36bc3

SHA1を計算する例

MessageDigest digest = java.security.MessageDigest.getInstance("SHA1");
byte[] hash = digest.digest("あいうえお".getBytes("UTF-8"));
StringBuilder hashStr = new StringBuilder();
for (int i = 0, l = hash.length; i < l; i++) {
    int h = hash[i];
    if (h < 0) {
        hashStr.append(Integer.toHexString(h + 256));
    } else {
        if (h < 16) {
            hashStr.append("0");
        }
        hashStr.append(Integer.toHexString(h));
    }
}
System.out.println(hashStr.toString());
// => 4ab0856318af20fa77d4492684fb8d9789e00cb6

java.security.MessageDigest | Java Platform SE 8 Javadoc
http://docs.oracle.com/javase/8/docs/api/java/security/MessageDigest.html

Scala

Javaの java.securitiy.MessageDigest で計算できる。

val digest = java.security.MessageDigest.getInstance("MD5");
val hash = digest.digest("あいうえお".getBytes("UTF-8"));
val hashStr = hash.map { b => "%02x".format(b); }.mkString;
println(hashStr);
// => 86deb27a32903da70a7b2348fcf36bc3

val digest = java.security.MessageDigest.getInstance("SHA1");
val hash = digest.digest("あいうえお".getBytes("UTF-8"));
val hashStr = hash.map { b => "%02x".format(b); }.mkString;
println(hashStr);
// => 4ab0856318af20fa77d4492684fb8d9789e00cb6

PHP

md5sha1 という標準の関数で計算できる。

echo md5("あいうえお");
// => 86deb27a32903da70a7b2348fcf36bc3

echo sha1("あいうえお");
// => 4ab0856318af20fa77d4492684fb8d9789e00cb6

md5 関数 | PHP Manual
http://php.net/manual/ja/function.md5.php

sha1 関数 | PHP Manual
http://php.net/manual/ja/function.sha1.php

Python

Python2での例

import hashlib

print hashlib.md5("あいうえお").hexdigest()
# => 86deb27a32903da70a7b2348fcf36bc3

print hashlib.sha1("あいうえお").hexdigest()
# => 4ab0856318af20fa77d4492684fb8d9789e00cb6

Python3での例

import hashlib

print(hashlib.md5("あいうえお".encode('utf-8')).hexdigest())
# => 86deb27a32903da70a7b2348fcf36bc3

print(hashlib.sha1("あいうえお".encode('utf-8')).hexdigest())
# => 4ab0856318af20fa77d4492684fb8d9789e00cb6

hashlib モジュール | Python 2.7 documentation
http://docs.python.jp/2/library/hashlib.html

Ruby / JRuby

require 'digest/md5'
require 'digest/sha1'

puts Digest::MD5.hexdigest('あいうえお');
# => 86deb27a32903da70a7b2348fcf36bc3

puts Digest::SHA1.hexdigest('あいうえお');
# => 4ab0856318af20fa77d4492684fb8d9789e00cb6

Perl

Digest::MD5 モジュールの md5_hex 関数はバイナリからMD5を計算し、16進数表記にしたものを返す。同じモジュールの md5 関数はMD5を計算し、結果のバイナリをそのまま帰す。

以下はMD5を計算する例。

use utf8;
use Encode qw/encode/;
use Digest::MD5 qw/md5_hex/;

# md5関数は計算結果のバイナリそのまま返すので print しようとするとターミナルが文字化けする
# print md5(encode('utf-8', "あいうえお"));

print md5_hex(encode('utf-8', "あいうえお"));
# => 86deb27a32903da70a7b2348fcf36bc3

MD5はバイナリを元に計算するので、文字列はencode関数でバイナリに変換する必要がある。

sha1であれば、Digest::SHA1モジュールの sha1 または sha1_hex 関数を使う。

sh (シェルスクリプト)

以下のように md5sum コマンドでMD5を計算でき、 sha1sum コマンドでSHA1を計算できる。

$ echo -n "あいうえお" | md5sum
86deb27a32903da70a7b2348fcf36bc3  -

$ echo -n "あいうえお" | sha1sum
4ab0856318af20fa77d4492684fb8d9789e00cb6  -

echo-nを付けているのは最後に改行を付けられるのを防ぐため。

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。