2012-06-18 11 views
6

私はこのようなクラスのコンストラクタがあります。私の他のクラスでByteBuffers hashCodesが同じ理由は何ですか?

public JavoImageCorrectedDataHeader() 
    { 
     ByteBuffer buffer = ByteBuffer.allocate(this.size()); 
     buffer.order(java.nio.ByteOrder.LITTLE_ENDIAN); 
     setByteBuffer(buffer, 0); 
     System.out.println("buffer.hasCode=" + buffer.hashCode()); 
    } 

を、私はその後

new JavoImageCorrectedDataHeader() 

を使用して、異なる場所と時間で上記のクラスの多くのインスタンスを作成し、私はそれが印刷されます期待しましたそれらのために異なるhashCodeを出してください。

buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 
buffer.hasCode=1742602241 

私はByteBufferの使用方法について何かを見逃している必要がありますが、私は実際には同じのhashCodeがプリントアウトされ参照してください。 Javadocのより

+0

http://docs.oracle.com/javase/1.4.2/docs/api/java/nio/ByteBuffer.html#hashCode() - ByteBuffer.hashCodeは、バッファ内の残りのコンテンツに依存します。 – Erik

+0

2つのオブジェクトが同じ 'hashCode'を持っていても、それらはそれらの類似性または同等性について何も意味しません。 –

+0

@Erik Java 6または7ではなく、古いドキュメントを参照しないでください。[ByteBuffer](http://docs.oracle.com/javase/6/docs/api/java/nio/)の実際のドキュメントです。 ByteBuffer.html) –

答えて

10

バイトバッファのハッシュコードは、その残りの要素に依存します。つまり、position()からlimit() - 1の要素までの要素に適用されます。

バッファハッシュコードはコンテンツに依存するため、ハッシュマップのキーとしてバッファを使用することはお勧めできません。それらの内容が変化しないことが分かっていない限り、類似のデータ構造

ByteBuffersを入力していない場合、または同じものを入力している場合、ハッシュコードは同じになります。

2

ByteBuffer.hashcodeは、ラップされたバイト[]のハッシュを計算します。この場合、新たに初期化されたbyte []の内容は各バイトごとに0です。 ByteBufferの内容が同じであれば、ハッシュコードは同じです。 ByteBuffer.javaソースコードから

5

:あなたの現在の実装の下で

public int hashCode() { 
    int hashCode = get(position()) + 31; 
    int multiplier = 1; 
    for (int i = position() + 1; i < limit(); ++i) { 
     multiplier *= 31; 
     hashCode += (get(i) + 30)*multiplier; 
    } 
    return hashCode; 
} 

position()は常に0を返しますので、ハッシュコードは常に同じです。ハッシュコードはバッファの内容に依存し、バッファの内容を表す物理オブジェクトには依存しません。

3

これは正しい動作です。 ByteBufferのドキュメントあたり:

、および場合のみ場合、2つのバイトのバッファは、彼らが残っている要素の数が同じで、かつ

、彼らは同じ要素型を持っている、

等しいです

残りの要素の2つのシーケンスは、開始位置から独立して考えると、点で等しくなります。

バイトバッファは他のタイプのオブジェクトと等しくありません。

したがって、this.size()が常に同じものを返すと仮定すると、バッファは常に同じです。したがって、hashCodeの一般規約に従えば、それらはすべて同じハッシュコードを持つ必要があります。

オブジェクトIDを判別するためにhashCodeを使用しようとしているようです - これは良い考えではありません(hashCodeと==のやりとりの仕組みのため)。あなたのクラスのインスタンスを互いに区別する必要があり、==演算子が与えるもの以上のものが必要な場合は、他の方法でそれを行う必要があります。

関連する問題