2010-10-08 33 views

Trả lời

42

Theo Reflector:

public override int GetHashCode() 
{ 
    return this; 
} 

Làm cho cảm giác, đúng không?

+0

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. –

+0

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ó. –

+3

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à –

-2

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.

+3

Có, nhưng điều đó không nhất thiết có nghĩa là nó đã được triển khai theo cách đó. :) –

+9

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. –

+10

@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

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