SHA-256

Pure PHP で SHA-256 を実装した人もいるけど、使ってみたところパフォーマンス的に苦しかったので mhash を使って適当に作ってみた。256 を 224/384/512 に変えても OK.

function sha256($str, $raw_output = false) {
    $hash = mhash(MHASH_SHA256, $str);
    return ($raw_output) ? $hash : bin2hex($hash);
}
function sha256_file($filename, $raw_output = false) {
    return sha256(file_get_contents($filename), $raw_output);
}

FreeBSD 6.0 には sha1 も sha256 もデフォルトでインストールされているけど、Mac OS X にはないので、これを応用してコマンドライン用の sha256 ツールを作ってみた。

#!/usr/bin/env php
<?php
if (!extension_loaded('mhash')) {
    dl('mhash.so') or exit(2);
}
$err = 0;
if ($argc > 1) {
    for ($i = 1; $i < $argc; $i++) {
        $file = $argv[$i];
        if (file_exists($file)) {
            if (is_readable($file)) {
                $hash = bin2hex(mhash(MHASH_SHA256, file_get_contents($file)));
                fwrite(STDOUT, sprintf("SHA256 (%s) = %s\n", $file, $hash));
            } else {
                fwrite(STDERR, sprintf("sha256: %s: Permission.denied\n", $file));
                $err = 1;
            }
        } else {
            fwrite(STDERR, sprintf("sha256: %s: No such file or directory\n", $file));
            $err = 1;
        }
    }
} else {
    $buf = '';
    while (!feof(STDIN)) {
        $buf .= fread(STDIN, 500000);
    }
    fwrite(STDOUT, bin2hex(mhash(MHASH_SHA256, $buf)));
    fwrite(STDOUT, "\n");
}
exit($err);
?>

sha1 はシェルの設定ファイルに

alias sha1='openssl sha1'

で。