2012-06-18 28 views
6

Me gustaría saber, teniendo en cuenta que Clojure usa hash de 32 bits para su implementación del mapa, si el mapa Clojure tiene, por lo tanto, un límite de 2^32-1 claves (y si esto no es cierto, cómo gestiona colisiones) y si su implementación hash es consistent. TIA!Límites y coherencia del mapa de Clojure

+0

¿Has mirado en el código fuente? – pmdj

+0

Sí, pero no puedo entenderlo completamente porque no soy un desarrollador de Java: por lo que he entendido, la función hash es hasheq, que delega a Entero en el caso particular de que la clave sea un Entero y al método Object hasheq. Pero no puedo entender (o rastrear) la función hash utilizada, si el mapa admite colisiones y si la función hash es consistente. –

+0

(Nunca entenderé algunos votos a la baja) –

Respuesta

10

mapas Clojure son una aplicación personalizada que es persistente e inmutable (es decir, no lo hace HashMaps uso de Java, que no proporcionarían un rendimiento suficiente cuando se utiliza en una estructura de datos inmutables).

Utiliza códigos hash de 32 bits, de ahí 2^32 posibles cubos hash. En el caso de colisiones, las claves y los valores se almacenan en una matriz para cada cubo hash, por lo que es posible tener más de 2^32 claves. Ver el PersistentHashMap source - en particular, la clase interna HashCollisionNode se usa para almacenar un cubo de claves/valores contra un único valor de código hash.

Dado que la cantidad de cubetas de hash posibles es fija, el hashing consistente es irrelevante; la clave nunca necesita ser reasignada.

Consulte también:

+0

¡Muchas gracias! –

Cuestiones relacionadas