Tôi đã tìm kiếm khắp nơi, nhưng tôi không thể tìm thấy bất cứ điều gì. Bất cứ ai có thể làm sáng tỏ về điều này?GetHashCode() được triển khai cho Int32 như thế nào?
Trả lời
Theo Reflector:
public override int GetHashCode()
{
return this;
}
Làm cho cảm giác, đúng không?
Cách tốt nhất để băm 32 bit giá trị thành 32 bit không phải là để tạo ra bánh xe, sử dụng giá trị chính nó. Rất nhanh, không va chạm, thực sự là một cách hoàn hảo.
Có, nhưng điều đó không nhất thiết có nghĩa là nó đã được triển khai theo cách đó. :) –
Trên thực tế nó là một cách AWFUL để thực hiện nó. Mỗi MS "Để có hiệu năng tốt nhất, hàm băm sẽ tạo ra một phân phối đồng đều cho tất cả đầu vào, bao gồm cả đầu vào được tập hợp nhiều. Hàm ý là các sửa đổi nhỏ đối với trạng thái đối tượng sẽ dẫn đến những sửa đổi lớn cho mã băm kết quả cho bảng băm tốt nhất hiệu suất." (http://msdn.microsoft.com/en-us/library/system.object.gethashcode.aspx) Việc thực hiện này trong khi đơn giản gây ra phân cụm xấu và có thể dẫn đến hiệu suất khủng khiếp khi int được sử dụng như các khóa có thể bắt đầu. –
@JeffWalkerCodeRanger Điều đó thường đúng. Nhưng hầu hết các bảng băm được thực hiện bằng cách thực hiện 'hashCode% bucketLength'. Do đó, chuỗi chung của '0, 1, 2, 3, ...' sẽ có các mã băm hoàn hảo. Tuy nhiên, nếu đầu vào của bạn là '0, 32, 64, 96, 128, ...' bất kỳ mảng kích thước thùng chứa nào của hai nhóm <= 32 sẽ có xung đột băm 100%. Nếu MS sẽ thay đổi nó để làm một số xáo trộn bit, sẽ có một chuỗi khác sẽ cung cấp cho 100% va chạm băm. Quan điểm của tôi là, không có ngữ cảnh cho Int32 và không có ngữ cảnh, bạn không thể tạo ra hàm băm tốt. Nếu bạn cần băm dữ liệu, hãy viết hasher của riêng bạn. – Aidiakapi
- 1. OpenID được triển khai như thế nào?
- 2. C# Generics được triển khai như thế nào?
- 3. HttpSession được triển khai như thế nào?
- 4. linq & khác biệt, triển khai bằng & gethashcode
- 5. Phạm vi Lexical được triển khai như thế nào?
- 6. IO không chặn được triển khai như thế nào?
- 7. Các mảng được triển khai trong java như thế nào?
- 8. Các mutex được triển khai như thế nào?
- 9. LLVM isa <> được triển khai như thế nào?
- 10. Chuỗi string.find được triển khai như thế nào trong CPython?
- 11. Các mảng được triển khai trong Perl như thế nào?
- 12. Facebook Chat Heads được triển khai như thế nào?
- 13. Atan2 được triển khai bằng .NET như thế nào?
- 14. Các khối try/catch được triển khai như thế nào?
- 15. Các tham chiếu yếu được triển khai như thế nào?
- 16. Thuộc tính phụ thuộc được triển khai như thế nào?
- 17. Máy tính Google được triển khai như thế nào?
- 18. Arrays.sort (Object [] a) - được triển khai như thế nào?
- 19. Bản đồ băm JavaScript được triển khai như thế nào?
- 20. GMail triển khai Comet như thế nào?
- 21. Việc triển khai chính xác cho GetHashCode() cho các lớp thực thể là gì?
- 22. Tại sao ValueType.GetHashCode() được triển khai giống như vậy?
- 23. Giá trị() được triển khai như thế nào cho Java 6 enums?
- 24. Hỗ trợ thời gian chạy ghc cho hồ sơ được triển khai như thế nào?
- 25. Việc triển khai BigNums hoạt động như thế nào?
- 26. Bạn sẽ triển khai đuôi hiệu quả như thế nào?
- 27. Sự khác biệt giữa GetHashCode được triển khai trong lớp Object và ValueType là gì?
- 28. Forth triển khai từ điển như thế nào? (tranh cãi)
- 29. Từ khóa java được đồng bộ hóa được triển khai như thế nào?
- 30. Triển khai Django: Bạn làm như thế nào?
Tôi cho là vậy. Tôi đã suy nghĩ tất cả các loại giá trị sẽ có một triển khai phổ biến. –
Không, mỗi loại Giá trị có riêng. UInt32 tự tạo thành Int32, điều này đơn giản là tự chuyển sang Inted Int. Int16 và Int64 làm một số bit chuyển dịch sôi nổi để tạo ra một Giá trị 32-bit. System.Boolean trả về 0 hoặc 1 tùy thuộc vào trạng thái của nó. –
Interesing, tại sao sau đó 'int a = 10;' và 'int b = 10.GetHashCode();' cung cấp các lệnh x86 khác nhau. Chúng tôi thấy rằng phương pháp một dòng này sẽ được gạch chân nên nó phải giống nhau nhưng không phải là –