He estado cavando en el código fuente tabla hash. Y encontró cómo se produce el hash:
int index = (hash & 0x7FFFFFFF) % tab.length;
No entiendo por qué bit a bit y se utiliza aquí?
si nos volvemos a binario 0x7FFFFFFF obtenemos = 1111 1111 1111 111 1111 1111 1111 1111
Como sé bit a bit y dará a 1 si el primer dígito y segundo = 1 Así que si tenemos algún código hash objeto, por ejemplo, 2314539
la convierten en binario y hacer la operación y que en realidad obtener el mismo dígito:
2314539 = 10 0011 0101 0001 0010 1011
10 0011 0101 0001 0010 1011
&
11 1111 1111 1111 1111 1111
=
10 0011 0101 0001 0010 1011
10 0011 0101 0001 0010 1011 = 2314539
Como se puede ver que esta operación no realiza ningún cambio. Entonces, ¿cuál es el punto aquí?
Vamos a empezar con el significado de resto ( %
) en Java. De acuerdo con JLS 15.17.3 :
La operación resto de operandos que son números enteros después de la promoción numérico binario (§5.6.2) produce un valor de resultado de tal manera que
(a/b)*b+(a%b)
es igual aa
.Se desprende de esta regla que el resultado de la operación resto puede ser negativo sólo si el dividendo es negativo, y puede ser positivo sólo si el dividendo es positivo. Por otra parte, la magnitud del resultado es siempre menor que la magnitud del divisor.
Supongamos que el index
se calcula como index = hash % tab.length
. Si esto fuera así, un valor negativo para hash
(el dividendo) daría como resultado un valor negativo para index
.
Pero vamos a utilizar index
para subíndice tab
, por lo que debe estar entre 0
y tab.length
.
En su lugar, el cálculo real asigna hash
a un número no negativo por primera vez por enmascarar el bit de signo. A continuación, se realiza la operación de resta.
Entonces, ¿cuál es el punto aquí?
- Su ejemplo fue trabajado por un positivo
hash
valor. La&
marca una diferencia para los negativoshash
valores. - El punto es evitar un negativo
hash
valor que da un negativoindex
valor que dará lugar a unaArrayIndexOutOfBoundsException
.