2014-07-23 15 views
5

các thuật toán được sử dụng trong JVM để thực hiện java.lang.Object 's ngầm hashCode() phương pháp là gì?gì chính xác là các thuật toán được sử dụng bởi hashCode java.lang.Object của

[OpenJDK hoặc Oracle JDK được ưa thích trong các câu trả lời].

+2

Chỉ tò mò ... Vì Java là một mã nguồn mở, điều gì khiến bạn không tự tìm kiếm? –

+5

@ PM77-1 có thể là thực tế rằng đây là phương pháp 'nguyên gốc' và không nhiều người biết tìm kiếm vị trí của nó ở đâu. – Pshemo

+2

Xem http://stackoverflow.com/questions/17977495/java-object-hashcode-algorithm - có liên kết đến nguồn gốc. Tuy nhiên, sau khi đọc nguồn tôi thậm chí còn bối rối hơn. – user2864740

Trả lời

5

Đó là thực hiện phụ thuộc (và nặng nề như vậy, thuật toán là hoàn toàn đến việc thực hiện, miễn là nó phù hợp.) Tuy nhiên, theo các câu trả lời here, bạn sẽ nhìn thấy native source file nơi băm được tạo ra trong OpenJDK 7 (nhìn vào get_next_hash() chức năng), mà thực sự chỉ rõ một số thuật toán có thể trong phiên bản đặc biệt này:

// Possibilities: 
// * MD5Digest of {obj,stwRandom} 
// * CRC32 of {obj,stwRandom} or any linear-feedback shift register function. 
// * A DES- or AES-style SBox[] mechanism 
// * One of the Phi-based schemes, such as: 
// 2654435761 = 2^32 * Phi (golden ratio) 
// HashCodeValue = ((uintptr_t(obj) >> 3) * 2654435761)^GVars.stwRandom ; 
// * A variation of Marsaglia's shift-xor RNG scheme. 
// * (obj^stwRandom) is appealing, but can result 
// in undesirable regularity in the hashCode values of adjacent objects 
// (objects allocated back-to-back, in particular). This could potentially 
// result in hashtable collisions and reduced hashtable efficiency. 
// There are simple ways to "diffuse" the middle address bits over the 
// generated hashCode values 
// 

Như đã nêu, các thuật toán mặc định là chỉ cần đi với một số ngẫu nhiên, tuy nhiên một bình luận thú vị hơn nữa xuống trạng thái:

Điều này tương tự như cách tiếp cận (obj^stwRandom) được đề cập trong danh sách các khả năng trên, nhưng nó xung quanh các quy tắc không mong muốn liên quan đến các đối tượng được phân bổ nhanh chóng liên tiếp bằng cách liên kết thông tin "tiểu bang cụ thể" vào băm - hai đối tượng đã xảy ra để được cấp phát tại một thời điểm rất giống nhau do chúng được phân bổ trên hai luồng riêng biệt thực thi đồng thời, thông tin luồng riêng biệt được đưa vào băm nên vẫn đảm bảo băm riêng biệt sẽ được tạo ra.

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