Nếu bạn sử dụng menu tái cấu trúc riêng của Visual Studio để thêm triển khai GetHashCode vào một lớp như thế này:
và chọn thuộc tính int duy nhất trong lớp:
nó tạo mã này trên .NET Framework:
public override int GetHashCode()
{
return -1937169414 + Value.GetHashCode();
}
( HashCode.Combine(Value)
thay vào đó, nó tạo ra trên .NET Core, điều mà tôi không chắc là nó có cùng giá trị không)
Điều gì đặc biệt về giá trị này? Tại sao Visual Studio không sử dụng Value.GetHashCode()
trực tiếp? Theo tôi hiểu, nó không thực sự ảnh hưởng đến phân phối băm. Vì chỉ là bổ sung, các giá trị liên tiếp vẫn sẽ tích lũy cùng nhau.
EDIT: Tôi chỉ thử điều này với các lớp khác nhau với Value
các thuộc tính nhưng rõ ràng tên thuộc tính ảnh hưởng đến số được tạo. Chẳng hạn, nếu bạn đổi tên tài sản thành Halue
, số sẽ trở thành 387336856. Cảm ơn Gotkhan Kurt, người đã chỉ ra điều này.
int
.
-1937169414
là phép nhân số nguyên của -1521134295
và -783812246
. Con số quan trọng hơn ở đây là -1521134295
xuất hiện trong mọi tính toán mã băm. -783812246
là số hạt giống. Một số hạt giống được chọn dựa trên số lượng thành viên trong phương trình. Trong các lớp ẩn danh, số hạt giống được tính dựa trên tên trường. Vì vậy, có nhiều số hạt giống như có số nguyên. Chúng ta có thể giả sử một số hạt giống là ngẫu nhiên. Về tầm quan trọng của -1521134295
, tôi nghĩ rằng nó làm giảm sự va chạm và chỉ có một nhà phát triển bên trong mới có thể trả lời chính xác làm thế nào.