Các tài liệu JDK cho java.lang.String.hashCode()
famously nói:Bằng chứng: tại sao việc triển khai java.lang.String.hashCode() khớp với tài liệu của nó?
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, nơis[i]
là *i
* nhân vật của chuỗi thứ,n
là độ dài của chuỗi và^
biểu thị lũy thừa.
Việc thực hiện tiêu chuẩn của biểu thức này là:
int hash = 0;
for (int i = 0; i < length; i++)
{
hash = 31*hash + value[i];
}
return hash;
Nhìn vào này làm cho tôi cảm thấy như tôi đang ngủ qua khóa học các thuật toán của tôi. Biểu thức toán học chuyển thành mã ở trên như thế nào?
RE câu đầu tiên của bạn: Bạn có thấy một số bằng chứng cho thấy câu hỏi hoặc câu trả lời cụ thể là giả định xor? –
Bạn đã thể hiện sự nhầm lẫn về cách mã và tài liệu có thể tương đương. Vì tài liệu đang sử dụng "^" cho lũy thừa, nhưng Java thường sử dụng nó để có nghĩa là xor bit, tôi tự hỏi nếu đó là nguồn gốc của sự nhầm lẫn của bạn. (Không có câu trả lời nào khác khi tôi bắt đầu viết câu trả lời của tôi, BTW) –
Ahh, tôi hiểu rồi. Không, tôi đã nhận thức được rằng đó là lũy thừa, nhưng không rõ ràng về cách thực hiện theo sau biểu thức toán học. Câu trả lời của bạn làm rõ rằng rất nhiều - nhưng biết viết mã đó chỉ cho biểu thức đó vẫn là một bước nhảy vọt đối với tôi. Để đến được đoạn mã đó, có vẻ như bạn phải viết ra một ví dụ nhỏ, nhận ra rằng bạn có thể "nhân với 0 một cách thông minh" trong việc làm tổ trong cùng để hoàn thành mẫu, sau đó tạo thành vòng lặp. –