Подтвердить что ты не робот

Почему Java использует (hash & 0x7FFFFFFF)% tab.length для определения индекса ключа?

Из приведенной ниже ссылки я знаю, что Java использует (hash & 0x7FFFFFFF) % tab.length, чтобы решить, какой слот массива помещает {ключ, значение} в.

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/util/Hashtable.java#Hashtable.put%28java.lang.Object%2Cjava.lang.Object%29

Мой вопрос: почему Java сначала делает хэш и 0x7FFFFFFF? Есть ли какая-то конкретная цель?

4b9b3361

Ответ 1

Потому что -1 % 10 == -1, который вы, конечно, не хотите индексировать в массив. Принуждение знакового бита к 0 позволяет избежать этой проблемы.

Ответ 2

Потому что:

  • 0x7FFFFFFF - 0111 1111 1111 1111 1111 1111 1111 1111: все 1, за исключением знакового бита.

  • (hash & 0x7FFFFFFF) приведет к положительному целому числу.

  • (hash & 0x7FFFFFFF) % tab.length будет находиться в диапазоне длины вкладок.

Ответ 3

Обратите внимание, что Hashtable более или менее устарел и был заменен на HashMap. Для достижения этой же цели используется hash & (table.length-1).

Он также выполняет некоторое смещение бит до того, как можно увидеть здесь. Это должно справиться с плохими реализациями метода hashCode(), которые возвращают числа с низким разнообразием.