2011-07-26 18 views
9

Mam niezmienną klasę, której jedynym polem jest bool[] (rozmiar określony w czasie wykonywania).GetHashCode() from booleans only

Jak mogę obliczyć dobry kod skrótu tej klasy? Zwykle po prostu zadzwoniłbym pod numer GetHashCode() na każde pole i połączyłem je z jednym z następujących operatorów: + | &, ale ponieważ jedynym możliwym hasłem jest 0 dla false i 1 dla true, to nigdzie mnie nie doprowadzi. Moja implementacja musi działać tylko z bools i musi działać dla tablicy o dowolnym rozmiarze.

(Prawdopodobnie nie ma większego znaczenia, ale ja kodowania w C#/.NET.).

+0

czy wziąłeś pod uwagę 'BitArray' lub w zależności od rozmiaru' BitVector32'? Wymagałoby to mniejszej implementacji, takiej jak 'GetHashCode' i tym podobne. – Sebastian

Odpowiedz

8

Zakładając bool[] nazwie bools:

unchecked { 
    int hash = 17; 
    for(int index = 0; index < bools.Length; index++) { 
     hash = hash * 23 + bools[index].GetHashCode(); 
    } 
    return hash; 
} 
+1

Czy możesz wyjaśnić liczby, proszę, Jason? Skąd pochodzą 17 i 23? :-) –

+0

@Jamie Dixon: To rodzaj standardowej implementacji; kluczowe jest to, że mnożnik jest podstawowym. Myślę, że Java 'String.getHashCode' jest czymś bardzo podobnym. – jason

+0

to nie zadziała, tablice z tymi samymi elementami w różnych pozycjach dadzą ten sam hashcode – mcabral

0

Proste bools.GetHashCode() działa dobrze, dopóki nie są zainteresowane o wydajności (w tym przypadku użyj rozwiązania Jasona).