いろいろな言語でMD5やSHA1などのメッセージダイジェストを計算する方法。
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
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);// => 86deb27a32903da70a7b2348fcf36bc3val 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
md5
やsha1
という標準の関数で計算できる。
echo md5("あいうえお");// => 86deb27a32903da70a7b2348fcf36bc3echo sha1("あいうえお");// => 4ab0856318af20fa77d4492684fb8d9789e00cb6
md5
関数 | PHP Manual
http://php.net/manual/ja/function.md5.php
sha1
関数 | PHP Manual
http://php.net/manual/ja/function.sha1.php
Python2での例
import hashlibprint hashlib.md5("あいうえお").hexdigest()# => 86deb27a32903da70a7b2348fcf36bc3print hashlib.sha1("あいうえお").hexdigest()# => 4ab0856318af20fa77d4492684fb8d9789e00cb6
Python3での例
import hashlibprint(hashlib.md5("あいうえお".encode('utf-8')).hexdigest())# => 86deb27a32903da70a7b2348fcf36bc3print(hashlib.sha1("あいうえお".encode('utf-8')).hexdigest())# => 4ab0856318af20fa77d4492684fb8d9789e00cb6
hashlib
モジュール | Python 2.7 documentation
http://docs.python.jp/2/library/hashlib.html
require 'digest/md5'require 'digest/sha1'puts Digest::MD5.hexdigest('あいうえお');# => 86deb27a32903da70a7b2348fcf36bc3puts Digest::SHA1.hexdigest('あいうえお');# => 4ab0856318af20fa77d4492684fb8d9789e00cb6
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
関数を使う。
以下のようにmd5sum
コマンドでMD5を計算でき、sha1sum
コマンドでSHA1を計算できる。
$ echo -n "あいうえお" | md5sum86deb27a32903da70a7b2348fcf36bc3 -$ echo -n "あいうえお" | sha1sum4ab0856318af20fa77d4492684fb8d9789e00cb6 -
echo
に-n
を付けているのは最後に改行を付けられるのを防ぐため。
==
/!=
/<
/<=
/>=
/>
/<=>
/ gt / ge / lt / le)*
/x
)=~
)+
/.
)