2013-05-08 28 views
6

là hàm hashCode() của java?Phương thức hashCode() của java có phải là định nghĩa không?

Tôi cố gắng triển khai công cụ tìm kiếm tài liệu sử dụng thuật toán minh họa và tôi sử dụng hashCode cho các từ được băm trước. Có phải cùng một từ sẽ nhận được cùng một băm mỗi khi tôi chạy nó?

Nó sẽ nhận được cùng một băm ngay cả khi tôi chạy nó từ một máy khác nhau (32 bit vs 64bit)?

+1

Tôi sẽ không đặt cược vào điều đó ... Nó thậm chí có thể xảy ra rằng băm có thể liên quan đến địa chỉ của đối tượng, và sau đó nó có thể thay đổi ngay cả từ một trong những chạy tiếp theo ... –

+0

Xem http: //stackoverflow.com/questions/1516843/java-object-hashcode-result-constant-across-all-jvms-systems – Annabelle

+0

Tại sao không yêu cầu một người bạn chạy một đoạn mã mẫu và xem? Tại sao không đăng đoạn mã nhỏ nói trên để tất cả chúng ta có thể làm điều đó? :) Điều đó đang được nói, tôi * không nghĩ rằng * hashCode đó là nhất quán giữa nhiều lần chạy, chỉ cho rằng một ở lại trong máy ảo. – Shark

Trả lời

9

Tùy thuộc vào lớp bạn đang đề cập đến. Cơ sở Object.hashCode thực hiện không phải là, vì, như stated in the documentation:

Càng nhiều càng tốt là hợp lý thực tế, phương thức hashCode định nghĩa bởi lớp Object không trở lại số nguyên phân biệt cho các đối tượng khác nhau. (này thường được thực hiện bằng cách chuyển đổi địa chỉ nội bộ của đối tượng vào một số nguyên, nhưng kỹ thuật thực hiện điều này là không cần thiết bởi các ngôn ngữ lập trình JavaTM.)

Addresses là không xác định, xem xét rằng đôi khi họ thậm chí còn được sử dụng như một nguồn entropy.

Nhưng, ví dụ, String có một mã băm xác định xác định như sau:

Formula from Wikpedia

(hình ảnh lấy từ Wikipedia)

Trong một số trường hợp thậm chí không có một định nghĩa xác định hợp lý cho mã băm.

+0

+1 nhưng bạn nên sử dụng [javadoc] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#hashCode%28%29) làm tham chiếu thay vì Wikipedia . – assylias

+2

Tôi chỉ nói rằng hình ảnh công thức đã được sao chép từ Wikipedia, không phải là tôi đã sử dụng nó làm tài liệu tham khảo. Làm rõ. –

4

Hợp đồng chung của hashCode được như Javadoc nói:

Bất cứ khi nào nó được gọi trên cùng một đối tượng nhiều hơn một lần trong một cuộc thi của một ứng dụng Java, các phương thức hashCode luôn phải trả lại số nguyên cùng, với điều kiện không thông tin được sử dụng bằng bằng so sánh trên đối tượng được sửa đổi. Số nguyên này không cần phải duy trì sự nhất quán từ một lần thực thi của một ứng dụng đến việc thực thi khác của cùng một ứng dụng.

Is the same word going to get the same hash every time that I run it?

Trong việc thực hiện các ứng dụng, cách gọi hashCode() chữ bằng nhau (tôi giả sử từ này là một ví dụ Stringequals() đã được ghi đè trong String) sẽ trả về số nguyên cùng.

EDITjavadoc cho String.hashCode() chỉ định cách mã băm của chuỗi được tính, đó là xác định.

Returns a hash code for this string. The hash code for a String object is 
computed as : 
s[0]*31^(n-1) + s 1 *31^(n-2) + ... + s[n-1]

+4

Câu trả lời của bạn là khó hiểu. 'hashcode' được xác định rõ ràng và xác định cho Strings, cho dù máy là 32 hay 64 bit – assylias

+0

Đã chỉnh sửa !!!!!!!!!! – NINCOMPOOP

+1

@assylias Vâng, điều này thực sự có thể là rủi ro DoS! Kẻ tấn công có thể xây dựng một yêu cầu HTTP với một chuỗi các chuỗi (env vars và params truy vấn) được thiết kế cố định để có cùng giá trị băm, chuyển một bản đồ băm ~ O (1) thành một danh sách liên kết O (N). Womp womp. – yshavit

3

Nói về các đối tượng nói chung: không.

Tuy nhiên nếu bạn đang nói về specificially String, sau đó tính toán hashcode được quy định một cách rõ ràng trong API của String.hashCode():

Trả về một mã băm cho chuỗi này.Các mã băm cho một đối tượng String được tính như

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1] 

sử dụng int số học, trong đó s [i] là kí tự thứ i của chuỗi, n là độ dài của chuỗi, và^chỉ lũy thừa. (Giá trị băm của chuỗi rỗng bằng không.)

Nói cách khác: bạn sẽ có thể phụ thuộc vào hashCode là ổn định cho chuỗi.

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