2012-06-18 33 views
6

Tôi có một constructor lớp như thế này:tại sao ByteBuffers hashCodes giống nhau?

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

Trong các lớp học khác của tôi, tôi có thể tạo nhiều trường hợp của lớp trên tại các địa điểm và thời gian khác nhau bằng cách sử dụng

new JavoImageCorrectedDataHeader() 

Sau đó, tôi hy vọng nó sẽ in ra hashCode khác nhau cho chúng. nhưng tôi thực sự thấy cùng hashCode được in ra:

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 

tôi phải bỏ lỡ điều gì đó về làm thế nào để sử dụng ByteBuffer.

+0

http://docs.oracle.com/javase/1.4.2/docs/api/java/nio/ByteBuffer.html#hashCode() - 'ByteBuffer.hashCode' phụ thuộc vào nội dung còn lại trong bộ đệm. – Erik

+0

Ngay cả khi hai đối tượng có cùng một 'hashCode', điều đó ngụ ý không có gì về sự giống nhau hoặc bình đẳng của chúng. –

+0

@Erik xin vui lòng không tham khảo tài liệu cũ, thay vì Java 6 hoặc 7. Đây là tài liệu thực tế của [ByteBuffer] (http://docs.oracle.com/javase/6/docs/api/java/nio/ ByteBuffer.html) –

Trả lời

10

Từ javadoc:

Mã hash của một bộ đệm byte chỉ phụ thuộc vào các yếu tố còn lại của nó; nghĩa là, khi các phần tử từ vị trí() đến và bao gồm phần tử ở giới hạn() - 1.

Vì mã băm bộ đệm phụ thuộc vào nội dung, không thể sử dụng bộ đệm làm khóa trong bản đồ băm hoặc các cấu trúc dữ liệu tương tự trừ khi nó được biết rằng nội dung của chúng sẽ không thay đổi.

Nếu bạn không điền số ByteBuffers hoặc điền chúng bằng cùng một thứ, mã băm sẽ giống hệt nhau.

2

ByteBuffer.hashcode cho phép bạn tính giá trị băm của byte được bao bọc []. Trong trường hợp này, nội dung của byte mới được khởi tạo [] là 0 cho mỗi byte. Cho rằng nội dung ByteBuffer là như nhau, hashcode là như nhau.

5

Từ mã ByteBuffer.java nguồn:

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

Dưới thực hiện hiện tại của bạn, position() luôn trả 0 và do đó, các hashcodes luôn giống hệt nhau. Mã băm phụ thuộc vào nội dung của bộ đệm, không phải trên đối tượng vật lý được sử dụng để biểu diễn nó.

3

Đây là hành vi đúng. Theo các tài liệu ByteBuffer:

Hai byte bộ đệm đều bình đẳng nếu, và chỉ nếu,

Họ có các loại cùng một nguyên tố,

Họ có cùng một số yếu tố còn lại, và

Hai chuỗi phần tử còn lại, được xem là độc lập với vị trí bắt đầu của chúng, tương đương nhau.

Bộ đệm byte không bằng bất kỳ loại đối tượng nào khác.

Vì vậy, giả sử rằng this.size() luôn trả về cùng một điều, bộ đệm của bạn luôn bằng nhau. Theo hợp đồng chung của hashCode, chúng phải có cùng mã băm.

Dường như bạn đang cố gắng sử dụng hashCode để xác định nhận dạng đối tượng - đây không phải là ý tưởng hay (vì cách hashCode và == tương tác). Nếu bạn cần phân biệt các cá thể của lớp của bạn với nhau, và cần nhiều hơn những gì toán tử == cung cấp cho bạn, bạn sẽ phải tìm một số cách khác để thực hiện nó.

Các vấn đề liên quan