Hash en la tabla hash de Java

Skyglar:

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, 2314539la 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í?

Stephen C:

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 a a.

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 indexse 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 indexpara subíndice tab, por lo que debe estar entre 0y tab.length.

En su lugar, el cálculo real asigna hasha 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í?

  1. Su ejemplo fue trabajado por un positivo hashvalor. La &marca una diferencia para los negativos hashvalores.
  2. El punto es evitar un negativo hashvalor que da un negativo indexvalor que dará lugar a una ArrayIndexOutOfBoundsException.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=468490&siteId=1
Recomendado
Clasificación