シェアする

  • このエントリーをはてなブックマークに追加

[PHP]配列やオブジェクトからハッシュを作成する

sha1やmd5など、ハッシュを生成する関数の引数は「文字列」ですが、配列やオブジェクトからハッシュを生成する方法です。

$keys = array(
	"ip" => "192.168.0.2",
	"ua" => "Mozilla/5.0 (Windows NT 5.1; rv:10.0) Gecko/20100101 Firefox/10.0",
);
sha1(serialize($keys));

配列をserializeで文字列に置き換えてからハッシュ化しています。

僕はデータベースに格納したいデータからハッシュを生成して、ハッシュ値でユニークを判断したり、テーブルの複数のフィールドをキーに検索したいときに、それらのフィールドの値から生成したハッシュで済ませたりという使い方をしています。

はじめの頃は、ハッシュ値がぶつかることを心配したりしたのですが、たとえばsha1のハッシュが衝突する確率は天文学的割合だったりするらしいです。
GitもSha1で生成したキーを使ってコミット管理しているほどですので、多分問題ないと思います。

地球上の人類 65 億人が全員プログラムを書いていたとします。そしてその全員が、Linux カーネルのこれまでの開発履歴 (100 万の Git オブジェクト) と同等のコードを一秒で書き上げ、馬鹿でかい単一の Git リポジトリにプッシュしていくとします。これを五年間続けたとして、SHA-1 オブジェクトの衝突がひとつでも発生する可能性がやっと 50% になります。それよりも「あなたの所属する開発チームの全メンバーが、同じ夜にそれぞれまったく無関係の事件で全員オオカミに殺されてしまう」可能性のほうがよっぽど高いことでしょう。

via : Pro Git – Pro Git 6.1 Git のさまざまなツール リビジョンの選択

他にも、オーダーメイドのギフトを扱う会社に収めたデザインギャラリーのシステムでは、画像から生成したハッシュで画像の重複登録を防ぐという使い方もしました。
ハッシュ関数はいろいろ応用が効いて便利です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする