For Want Of A Better Word

hashとは、 javaのhashMap hashSetとは

      2015/04/19

  • とにかく。このhashという概念が理解できていないので何とか整理したい。

http://dic.nicovideo.jp/a/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5

hashとは

入力データをもとに、ハッシュ生成アルゴリズム(複数あるmd5 やsha256)作成される文字列(データ)でのことで下記の特徴を持つ。
  • 同じデータに対しては同じハッシュが生成されなければならない。
  • あるハッシュ値を出力するデータを意図的に生成することが十分に難しい →ハッシュ値が分かっ- ても元データが復号できない。
  • 異なるデータに対しては異なるハッシュが生成される →ハッシュ値の重複はあり得ない。
  • ハッシュの長さはできるだけ短い→データ量として扱いやすい。

じゃあそんなhashを使ってどんなことをするのか。

  • ダウンロードしたファイルが改竄されたり破損したりしていないかを確認する。
    • 元データのhash値とダウンロードファイルのhash値が一致していれば、データ破損はないと言える。(確実ではないが。。)
  • 大量のデータから特定のデータを探す際の目印にする。(ハッシュテーブル)
    • テーブル上、各データが存在する。その中からデータを検出するために、データそのものの一致を検証・検索するとデータの大きさから処理上の負荷になる。そこで、hash値により、元データより小さいサイズの一データを持つ。この時必ずしも、hashは一意になるわけではないので、hashによる管理プラス。何らかの値同一性の確認が必要になる。
  • パスワード自体を保存することなくパスワードの照合を行う。
    • ハッシュ化されたデータは流出しても、復号化が難しい。(不可逆ではあるが、必ずしも元データを特定できないわけではなし。総当たりすれば孰れたどり着く。)直接参照されるよりはましということで、hash値をパスワードを保存しておき、認証時のパスワード入力もhash化して比較その一致を比較する。

(気になるのは、hashは必ず一意となるのかということ。。。)→ハッシュ化アルゴリズムは一意性を保証するものではない。

    • 同じ入力に対して、同じハッシュ値を生成するというもの。別データでも、同じハッシュ値が生成される可能性はある。(極めて低いけれど。。 )
では、疑問。

java コレクションにおいて、オブジェクトをhashで管理する(MapやSet)機能がある。

・hashMapはhashがキーになり、オブジェクトがvalueの連想配列的なもの? →まさしく連想配列でOK
 Mapはキーが重複しなければ、同じvalue(オブジェクト)を登録できる。

・hashSetは、オブジェクトの重複が許されないコレクション。
登録されたオブジェクトは hashで管理される

どちらにおいても、ハッシュ化だけでは一意性は保証できないはずだ!どうやって管理するのだ。

  • javaにおいては、hashコードはjavaオリジナルアルゴリズムで実装されているよう。また一意性を保つものではなく、一定のフィルタリングを実施するレベルの利用にとどまっている。hashでデータの中から絞込み、さらにequalsで同一性を確認するという仕組みらしい。

 - java, 意味を調べた言葉, 開発全般

  関連記事

php-logo
辞書順比較における大文字小文字の前後

大文字の方が大きい(後ろ)扱いです。

no image
レトロなフォント探し

http://d.hatena.ne.jp/masa_charcoal/2010 …

php-logo
HTTPレスポンスヘッダ

http://d.hatena.ne.jp/s-kita/20080927/12 …

no image
yum groupインストール Development Tools

Redmine環境を構築するにあたり WEBで見てたら、初めてgroupinst …

no image
WEBフォント

http://thinkit.co.jp/story/2011/08/18/22 …