ハッシュ
ハッシュ、一般に「ハッシュ」を行うために、翻訳、また、「ハッシュ」の直接音訳、すなわち、任意の長さの入力は、ハッシュアルゴリズムを介して、出力は、ハッシュ値であり、固定長出力に変換しています。アドレスはデータのハッシュ値として格納され、この変換は、圧縮マップであり、単純に任意の長さのメッセージが機能ダイジェスト固定長メッセージに圧縮されることを意味します。レコードが存在する構造に等しいキー、位置はF(K)に格納されなければならないとき、及び場合、データ検索キー(例えば、K)がオンになっています。このように、何の直接比較は、チェックレコードで行うことはできません。我々は、ハッシュテーブルのように、このイベントによって確立されたハッシュ関数f(ハッシュ関数)との間のこの対応を呼び出します。
ハッシュ関数f(キー)との競合の方法によれば、上記のように連続したアドレス(間隔)の有限集合にキーワードのセットにマッピングされ、「好き」などのキーワードに対処するために集中しますテーブル内の格納位置レコードは、このテーブルは、マッピングプロセスは、ハッシュまたはハッシュテーブルを作成すると呼ばれ、ハッシュ・テーブルと呼ばれる、得られた記憶場所は、ハッシュアドレスと呼ばれます。
ハッシュ衝突
別のキーワードに同じハッシュアドレス、KEY1 KEY2≠、そしてf(キー1)= F(KEY2)、ハッシュの競合として知られる現象を得ることができます。それは次のようになります。それに対応するハッシュアドレスがKEY1を占領されている見つけるKEY1、共感、KEY2を格納するハッシュアドレスによって得られたキー1のF(KEY1)。
ソリューション(4の合計):
1.メソッドOpenAddressed
いわゆるオープンアドレス指定方法は、紛争後、次の空のハッシュアドレスを探して行ってきました、限りハッシュテーブルは十分な大きさであるように、空のハッシュアドレスは常に見つけ、レコード店ことができるということです。
アドレス指定方法開き:こんにちは=(H(キー)+ DI)MOD M、i = 1,2、...、K(K <= M-1)、ハッシュ関数にここでH(キー)、mはハッシュテーブルであります長さ、DI配列をインクリメント、以下の3つがエミュレートすることができます。
1)。ディ= 1,2,3、...、M-1、前記再ハッシュリニアプローブ。
2)。ディ= 1 ^ 2、( - 1)^ 2 ^ 2,2、( - 2)^ 2、(3)^ 2、...、±(K)^ 2は、(K <= M / 2)、二次前記しました再ハッシュを検出します。
3)。ディ=擬似乱数列、およびその後の検出は、擬似ランダムハッシュを述べました。
法の練習に取り組むことにより、競合が開かれている解決:衝突が発生した場合、いくつかの検出技術(リニア検出方法、二次検出法(線形プローブの蓄積の問題を解決するために)、同じランダムな検出方法(第二の検出原理を使用し、ありません同じである:値をスキップする二次検出は、ハッシュアドレスがランダム変数ホップ長検出値である))プローブ配列のハッシュテーブルに形成されています。細胞による検索セルに沿ってこの配列は、それが特定のキーワードを検索し、またはオープンアドレス(すなわち、位置が空である)を横切ってこれまで挿入することができるまで。
例えば、我々は、集合{キーワード} 12,67,56,16,25,37,22,29,15,47,48,34、12のテーブル長です。私たちは、ハッシュ関数f(キー)=キーMOD L2を使用します
フロント12,67,56,16,25 Sの数を計算する場合、{}、それらは競合ハッシュアドレス、直接入金していません。
キー= 37、それが発見されたF(37)= 1を算出し、衝突の25の位置に、この時間が配置されています。
その後、我々は、上記の式f(37)=(F(37)+1)12 = 2 MODを適用します。37は、次に、2標識の位置に格納されます。
2.再ハッシュ
次いで、無競合までハッシュ関数のアドレスを計算するために第二、第三の、...、等を使用して、競合が発生した二重ハッシュ、異なるハッシュ関数を複数、ハッシュと呼ばれます。凝集しにくいが、それは計算時間を増加させます。
3.チェーンアドレス方式(のJavaハッシュマップがそうです)
ノードのハッシュテーブル複数の次のポインタで単独でリンクされたリストを構成することができる、単一の同義語とリンク内のすべてのノードをキーワード、各ノードのハッシュテーブルの次のポインタを有している:基本的な考え方は、チェーンアドレス方法があること次のようなリスト、
M = 5と、以下ハッシュテーブルによって確立されたチェーンアドレス法に従ってH(K)= K MOD 5、キー値のシーケンス例5、21、17、9、15、36、41、24、それは示しています。
4.一般的なオーバーフロー領域を確立
この方法の基本的な考え方は次のとおりです。ハッシュテーブルは、2つの部分、ベーステーブルとオーバーフローテーブル、要素および基本的な紛争の任意のテーブル、常に移入オーバーフローテーブルに分割されています。
コードの実装:
Personクラス:
JavaのhashCodeメソッドについて、参照してください。
https://www.cnblogs.com/dolphin0520/p/3681042.html
1 パッケージmy.hash; 2 。3 / ** 。4 * Personクラス 5 *に等しいとhashCodeメソッドのオーバーライド方法 。6 *オブジェクトのハッシュコードを計算するハッシュコード方法 。7 * Javaオブジェクトは、それぞれのハッシュコードを有するに 8 * @authorのASUS 。9 * 10 * / 11 12である パブリック クラス人{ 13は プライベート文字列名; 14 プライベート INT 年齢; 15 16 // SETおよび方法を得ること 。17 公共の文字列のgetName(){ 18は リターン名; 19 } 20 公共 ボイドのsetName(文字列名){ 21 この .nameの= 名前。 22 } 23 公共 int型getAge(){ 24 リターン年齢。 25 } 26 公共 ボイド setAge(int型の年齢){ 27 この .age = 年齢。 28 } 29 30 // 构造器 31 公衆人(文字列名、int型の年齢){ 32 スーパー()。 33 この .age =年齢; 34 この .nameの= 名前。 35 } 36 37 // 输出方法 38 パブリック文字列のtoString(){ 39 リターン "人物[NAME =" +名+ "年齢= "+年齢+"]" 。 40 } 41 42 // 重写ハッシュコード方法 43 公共 int型のハッシュコード(){ 44 、最終 INTプライム= 31 。 45 int型の結果= 1 。 46 結果=プライム*結果+ 歳。 47 結果=プライム*結果+((名前== nullの)?0:name.hashCode()); 48 リターン結果; 49 } 50 51である * / オーバーライドメソッドに等しい 52 *は、ときに、同じメモリアドレスへのマップを確実にするためにオブジェクトので、このメソッドをオーバーライドhashCodeメソッドをオーバーライドする必要があります 53 * / 54 パブリック ブール等しい(オブジェクトオブジェクト){ 55 IF(この ==のオブジェクト){ 56は、 戻り trueに、 57である } 58 IF(オブジェクト== NULL ){ 59 リターン falseに; 60 } 61が IF(のgetClass()=!object.getClass()){ 62 リターン 偽。 63 } 64 人の他= (人物)オブジェクト。 65 もし(!年齢= other.age){ 66 であれば(other.name =!ヌル){ 67 リターン はfalse ; 68 } 69 } 他の 場合(!name.equals(other.name)){ 70 リターン はfalse ; 71 } 72 リターン 真。 73 } 74 }
JavaコードのgetClassメソッド、より多くの情報について:
https://blog.csdn.net/mark_to_win/article/details/38757259
テストカテゴリ:
1つの パッケージmy.hash。 2 3 インポートはjava.util.HashSet。 4 5 パブリック クラスのテスト{ 6 パブリック 静的 ボイドメイン(文字列[]引数){ 7 // 构造6个人对象 8 人物P1 = 新しい人物( "SAM"、10 )。 9 つのP2 = 新しい人物( "花子"、13 )。 10 のP3 = 新しい人物( "リリ"、22 ); 11 のP4 = 新しい人物( "大明"、34 )。 12 P5 =人物新しい新規人物( "A"、2 ); 13である 人P6 = 新しい新規人物( "B"、2 ); 14の 15 // aとbハッシュコードの出力値 16 のSystem.out.println(「ハッシュコードの値: "+ p5.hashCode()+" B用のハッシュコード値:「+ p6.hashCode()); 17 18である //はHashSetのセットに格納されたPersonオブジェクトを定義する 19。 HashSetの<人>設定= 新しい新しい HashSetの<人> (); 20は 21である // 追加するHashSetのPersonオブジェクトセット 22は 、(P6)をset.add 23であり ;(P5)set.add 24 set.add(P4)を、 25 set.add(P3) 26であり ;(P2)set.add 27 set.add(P1); 28 29 // トラバースHashSetの、ハッシュコードP5とP6と、同じ、しかしSETのセットに加え、下層液をHashSetの記載しましたハッシュの競合の問題。 30 のために(人人:SET){ 31である のSystem.out.println(人物); 32 } 33である } 34です }
結果: