Trong khi duyệt thi hành Dictionary<TKey, TValue>
lớp generic trong mscorlib.dll, tôi nhận thấy những điều sau đây sử dụng nhiều lần để có được một băm-key: GetHashCodeGetHashCode (key) & int.MaxValue
int num = this.comparer.GetHashCode(key) & int.MaxValue;
() lợi nhuận một int. Tôi có nhầm lẫn khi nghĩ rằng bitwise AND giữa int.MaxValue và bất kỳ số nguyên nào x, sẽ luôn trả lại x?
Ai đó có thể giải thích tại sao toán tử & được sử dụng theo cách trên?
Lý do có khả năng nhất để thực hiện việc này là giá trị của số lượng modulo kết quả của các nhóm sẽ được tính toán, để có được nhóm đúng. Điều đó sẽ không hiệu quả đối với các số âm. – svick
Tôi muốn sẵn sàng đặt cược một đồng đô la toàn bộ việc thực hiện Từ điển trong .NET không quan tâm liệu mã băm có dương hay âm hay không, và người viết mã đang thực hiện nó trong một nỗ lực (có thể không được thông báo) để tránh kết hợp các hệ số chính với số lượng nhóm: http://stackoverflow.com/questions/3613102/why-use-a-prime-number-in-hashcode –
@Chris: Theo OP, mã đó * là * từ thực thi .NET 'Dictionary '. Như svick gợi ý, có lẽ để đảm bảo rằng số thùng - một chỉ số mảng, iirc - luôn dương. –
LukeH