Tôi có hai khách hàng mà tạo IPAddress
trường từ cùngbyte[]
và gửi nó đến máy chủ qua WCF (sử dụng DataContractSerializer
).Hai bình đẳng trường IPv6 IPAddress trở GetHashCode khác nhau kết quả
Trên máy chủ, các trường hợp IPAddress
này được chèn làm khóa trong từ điển nhưng vì lý do nào đó chúng được thêm làm các khóa khác nhau.
Khi đăng nhập, tôi thấy chúng bằng nhau nhưng GetHashCode
trả về các kết quả khác nhau.
var client1Address = // sent from client1
var client2Address = // sent from client2
Console.WriteLine(client1Address.Equals(client2Address));
Console.WriteLine(client1Address.GetHashCode().Equals(client2Address.GetHashCode()));
Output:
true
false
Làm thế nào có thể bằng IPAddress
trường hợp trở lại khác nhau GetHashCode
kết quả?
Thú vị tìm thấy. – Lloyd
Tôi tin rằng kịch bản chính xác này được cảnh báo trong .NET GetHashCode và String Compare và String dựa trên các toán tử Equality. Tôi không nghĩ rằng đây là một lỗi trong đó GetHashCode là một tài sản thời gian chạy NET tư nhân hiệu quả mà không nên được sử dụng trực tiếp bởi mã của chúng tôi ở cấp ứng dụng. Vì IPV6 là một điều được biết, tôi sẽ sử dụng chính địa chỉ đó là Hash Code hoặc Equality operator. Nhưng tôi sẽ làm so sánh thực tế ở mức byte cho một giá trị được định dạng. Tương tự như cách thức hoạt động của guid. “ABCD-123” = “abcd123” Từ góc nhìn thiết kế Tôi nghĩ đó là một lỗi. Họ có thể thay đổi nó ngay bây giờ không? –
@SqlSurfer 'GetHashCode' không phải là riêng tư và nó không được sử dụng trực tiếp. Khi bạn sử dụng 'IPAddress' làm khóa từ điển, nó sử dụng' GetHashCode' trong nội bộ. Lỗi ở đây là mã băm được lưu trữ và được tuần tự hóa khi không được. – i3arnon