Podczas przeglądania wdrożenie generycznego Dictionary<TKey, TValue>
klasy w pliku mscorlib.dll, zauważyłem następujące używane wiele razy, aby uzyskać hash-klucz:GetHashCode (key) i int.MaxValue
int num = this.comparer.GetHashCode(key) & int.MaxValue;
GetHashCode() zwraca int. Czy jestem w błędzie myśląc, że bitowe ORAZ pomiędzy int.MaxValue i dowolną liczbą całkowitą x, zawsze zwróci x?
Czy ktoś może wyjaśnić, dlaczego operator & jest używany w powyższy sposób?
Najbardziej prawdopodobną przyczyną tego jest obliczenie wartości wyniku modulo liczby wiader, aby uzyskać prawidłową łyżkę. To nie działa poprawnie dla liczb ujemnych. – svick
Byłbym skłonny postawić cały dolar, że implementacja słownika w .NET nie obchodzi, czy hashcode jest pozytywne czy negatywne, i że osoba, która napisała kod, robi to w (prawdopodobnie nieuprawnionej) próbie aby uniknąć dopasowania współczynników prime z liczbą segmentów: http://stackoverflow.com/questions/3613102/why-use-a-prime-number-in-hashcode –
@Chris: Według PO, ten kod * jest * z implementacji .NET 'Dictionary'. Jak sugeruje svick, prawdopodobnie zapewnia to, że numer wiadra - indeks tablicy, iirc - jest zawsze dodatni. –
LukeH