I.背景
DIYの「アリ・ババのJava開発マニュアル」孤独なメイクファーストクラスの首長の著者は、組織化の人々の最初の数百人から、わずか60人の存在に付着があります。
まず、深くインスパイア自分は彼らの深さを刺激します
第二には、それを自分で行う練習は完璧になります
被写体であることを特徴と20:カテゴリを選択し、そのハッシュコードメソッドは、コアロジック設計及びコードを記載しました。
私はロングクラス分析を選択してください。
第二に、分析
2.1カテゴリを選択し、そのハッシュコードメソッドは、コアロジック設計及びコードを記載しました。
がjava.lang.Long#のhashCode(ロング)
/**
* Returns a hash code for this {@code Long}. The result is
* the exclusive OR of the two halves of the primitive
* {@code long} value held by this {@code Long}
* object. That is, the hashcode is the value of the expression:
*
* <blockquote>
* {@code (int)(this.longValue()^(this.longValue()>>>32))}
* </blockquote>
*
* @return a hash code value for this object.
*/
@Override
public int hashCode() {
return Long.hashCode(value);
}
デザイン哲学:
long int型34は、64ビットであり、ハッシュ値はとても32ビットに64ビット以下、int型です。
ハイとローが離散した結果ので、ハッシュ計算に参加することができますしてみましょう。
コアロジック:長いハッシュ値を前半との排他的論理和を得後半することによって得られます。
public static int hashCode(long value) {
return (int)(value ^ (value >>> 32));
}
ハッシュ衝突を構築する方法2.2
ハッシュ値、すなわち、32ビット、64ビット演算を取得するためにlongに小規模マップの広い範囲に話しているので、これハッシュ衝突が存在しなければなりません。
ロングハッシュ関数マッピング規則、単純な構造は、ハッシュがルールに基づいて最適な方法を見ることができ、低および高コンシステンシー0と1を入れ替えまたは入れ替え、演算結果。
// [1]がハイとロー交換
long value = Long.MAX_VALUE - 1024L;
System.out.println(Long.toBinaryString(value));
// 取高32位
long high32 = value >>> 32;
// 取高32
long low32 = value << 32;
// 高 32 和 低32 互换
long newValue = high32 | low32;
// 新的hash 值 和原值相同
System.out.println(newValue);
Assert.assertEquals(Long.hashCode(value), Long.hashCode(newValue));
[2] // 0と1のスワップ
// 高位取反,低位 0 填充
newValue = Long.MAX_VALUE & value;
System.out.println(newValue);
Assert.assertEquals(Long.hashCode(value), Long.hashCode(newValue));
値を迅速に2つのハッシュ値によって決定することができ、同じ機能に等しいによって決定される、異なっています。
java.lang.Longの番号の等号
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
しかし、また、ハッシュコード機能性を保証は、ハッシュコードの書き換えが同じ定数に等しい等しい2つのオブジェクトを変更します。
同じ呼を確保する唯一の方法は、ケースは、おそらくのようなハッシュコード位相(同じハッシュ値)によって優先順位を決定することであるかどうかを決定するに等しいです。
ハッシュ関数の性質は、デジタルデータに符号化され、INTのJavaのハッシュコードの戻り型、ハッシュ関数がひどく書かれた場合、または整数型のものよりも、いくつかの数より大きい、コンフリクトは、同一の必然(HA異なるオブジェクトを生じる可能性があるれていますギリシャ値)。
一般的にはそのすべての適度な手段を極力優れたハッシュ関数、ハッシュ回避の競合に設計された操作に関与していること。
紛争後、通常は公衆オーバーフローに再ハッシュ、ジッパーなどによって対処する必要があります。
同様に、あなたはまた、彼らの計算されたハッシュ値を参照ハッシュ衝突を構築する方法を研究する、などの文字列、整数、などの他のクラスを選択することができます。
第三に、要約
多くの人々は、知識の片言のポイントの多くにつながる、より少ない時間で開発したソースコードを参照してください。
私はまた、ソースコードを読む習慣を開発する必要があるので、いくつかの問題が、DIYのクラスで孤独なギャングを行います。
私たちは開発中のソースコードを見て、通常は時折、学ぶために問題を取ることができると思います。