2011-07-26 11 views
9

tengo una clase inmutable cuyo único campo es un (tamaño determinado en tiempo de ejecución) bool[].GetHashCode() desde booleanos única

¿Cómo puedo calcular un buen código hash de esta clase? En general, simplemente llamaría al GetHashCode() en cada campo y los combiné con uno de estos operadores: + | &, pero dado que los únicos códigos hash posibles son 0 para false y 1 para true, eso no me va a llevar a ninguna parte. Mi implementación necesita funcionar solo con bools, y debe funcionar para una matriz de tamaño arbitrario.

(Probablemente no importa mucho, pero estoy de codificación en C#/.NET..)

+0

¿ha considerado 'BitArray' o según el tamaño' BitVector32'? Eso requeriría menos implementación como 'GetHashCode' y similares. – Sebastian

Respuesta

8

Asumiendo que su bool[] se llama bools:

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

¿Puedes explicar los números, por favor, Jason? ¿De dónde vienen 17 y 23? :-) –

+0

@Jamie Dixon: Esto es una especie de implementación estándar; el punto clave es que el multiplicador es un primo. Creo que Java 'String.getHashCode' es algo muy similar. – jason

+0

esto no funcionará, las matrices con los mismos elementos en diferentes posiciones darán el mismo código hash – mcabral

0

simple bools.GetHashCode() funciona bien hasta que le preocupa sobre el rendimiento (en este caso, use la solución de Jason).