• ベストアンサー

hashCodeの使用について

いつもお世話になっています。 hashCodeについて聞きたいのですが、 hashCodeは、暗号化にも利用されるらしいのですが、 使用理由がよくわかりません。 その場合、 http://www.kab-studio.biz/Programing/JavaA2Z/Word/00000045.htmlのURLによると、 HashMapクラスはキーからハッシュコードを取得し、ハッシュコードごとにグループ分けして値を格納する。 値を取得する時には、取り出すために渡されたキーからハッシュコードを取得し、そのハッシュコードを元にまず ハッシュコードごとのグループを取得し、 その後グループ内でキーを元に全検索を行う。 この方法によりHashMapクラスは値の検索がArrayListクラスよりも 早い。 また、ハッシュコードから元のデータは復元できないため、暗号化にも 使用される。 、 どういうことなのでしょうか? 上記の文を解釈して、ソースを作成しようとは思ったのですが、 よくわかりません。 作成してみたソースは、 HashMap hashMap = new HashMap(); //ハッシュコードで格納するmapデータ Map map = new HashMap(); map.put(0,"Tell"); map.put(1, "AAA"); map.put(2,"TTT"); //ハッシュコード String keyword = "keyword"; int key = keyword.hashCode(); //ハッシュコードでキーを設定 hashMap.put(key,map); //格納するMap Map maP = new HashMap(); for(int h=0;h<hashMap.size();h++) { //キーワードをハッシュコードに変換 int stK =keyword.hashCode(); //ハッシュコードで格納したMapデータの取り出し maP = (Map) hashMap.get(stK); } //Mapデータ表示 for(int i=0;i<maP.size();i++) { System.out.println(maP.get(i)); } つまり、ハッシュコードは文字が暗号化され、元の文字がわからない = 暗号化されたに等しくなる ということだけは何とかわかるような気はするのですが。。。 聞きたいのは、ハッシュコードをmapキーにした場合、 後でもし取り出したくなったりしたらどうすべきなのでしょうか? たとえば、どういった処理の場合に使用できるのでしょうか? また、hashCode()はしょっちゅう使用すべきではないのでしょうか? 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>たとえば、どういった処理の場合に使用できるのでしょうか? >また、hashCode()はしょっちゅう使用すべきではないのでしょうか? hashCode()は、コレクションなどで自作のクラスを使用している時にオーバーライドします。 質問文では、keywordオブジェクトがStringとなっていますが、実際には以下のような感じの時などにhashCode()やequals()のオーバーライドが必要となってきます。 // 基本データ型やStringでなく、独自の参照型「KeyWord」を使用。 KeyWord keyword = null; int key = keyword.hashCode(); 詳細に関しては、以下のようなSJC-Pの書籍などを参考にしてください。 Sun SJC-P認定ガイド 310-055対応 http://ec.nikkeibp.co.jp/item/books/P82770.html

kannitiha
質問者

お礼

回答ありがとうございます。 提示して頂いたテキスト確認してみました。 何となくのイメージは、湧いたように思います。 どうやら、これを極めるのはかなり難しいみたいです。 ありがとうございました。

その他の回答 (1)

回答No.1

ハッシュは検索というよりもダイレクトアクセスに近い。ただし記憶領域を大量に使うため、そこらへんのトレードとなる。ハッシュコードをキーにした場合は内部でハッシュコードのハッシュが生成されるだけ。大量の検索処理がある場合、データを高速に処理したい場合にはハッシュを使うとめちゃ速くなる。 利用したい時は普通に変数みたいに使えばいいだけ。便利だから俺は超好きだよ。 あでも、見取り図における巡回サラリーマンの問題の解決には、ある程度のパブリックドメインの問題が付きまとうから気をつけて

kannitiha
質問者

補足

回答ありがとうございます。 >記憶領域を大量に使うため、そこらへんのトレードとなる。 というのはどういうことなのでしょうか? ネットで調べようと思ったのですがトレードがよくわかりません。 >利用したい時は普通に変数みたいに使えばいいだけ~ 使用するときは、一般にどのように使用されているのでしょうか? つまりlist.add(ハッシュード、value値)な感じでしょうか。 >見取り図における巡回サラリーマンの問題の解決には、ある程度のパブリックドメインの問題が付きまとうから気をつけて よくわからなかったので、「巡回サラリーマン」の意味をネットで検索してみたのですが、 つまり、最短の方法を探すのはいいけれど、 それに対し無駄な処理が含まれるということでしょうか? 役立ちそうな気がしたので、 http://www.infonet.co.jp/ueyama/ip/software/tsp.htmlのURLを参考したのですが、 それは、 数値の場合にのみ当てはまる処理なのでしょうか? 例えば文字だとしたら、 Listに、"AA","BB","CC","DD","EE"という文字が格納されていて、 これをアルファベット順に表示するとしたら、、 AAとBB,AAとCC,AAとDD,AA,EEといったように文字を比較して表示する 際、に考えられたりする処理ではないのでしょうか? 宜しくお願いします。