6

私はこのようなクラスコンストラクターを持っています:

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が出力されることを期待していました。しかし、実際には同じ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の使い方について何か見逃しているに違いありません。

4

4 に答える 4

11

javadoc から:

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

バッファ ハッシュ コードはコンテンツに依存するため、コンテンツが変更されないことがわかっている場合を除き、バッファをハッシュ マップまたは同様のデータ構造のキーとして使用することはお勧めできません。

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

于 2012-06-18T19:47:06.987 に答える
5

From the ByteBuffer.java source code:

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;
}

Under your current implementation, position() always returns 0 and thus, the hashcodes are always identical. The hashcode is dependent on the content of the buffer, not on the physical object that is used to represent it.

于 2012-06-18T19:49:10.823 に答える
3

これは正しい動作です。ByteBuffer ドキュメントによると:

2 バイト バッファが等しいのは、次の場合のみです。

それらは同じ要素タイプを持ち、

それらは同じ数の残りの要素を持ち、

残りの要素の 2 つのシーケンスは、それらの開始位置とは関係なく、点ごとに等しいと見なされます。

バイト バッファは、他のタイプのオブジェクトと同じではありません。

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

オブジェクトのアイデンティティを決定するために hashCode を使用しようとしているようです - これは良い考えではありません (hashCode と == の相互作用のため)。クラスのインスタンスを互いに区別する必要があり、== 演算子が提供する以上のものを必要とする場合は、他の方法を見つける必要があります。

于 2012-06-18T19:50:28.320 に答える
2

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

于 2012-06-18T19:48:41.743 に答える