Побитовые операции

tox1cozZ

aka Agravaine
8,453
599
2,906
Давно пытаюсь понять, для чего они нужны.
Например, в классе BlockPos(майнкрафт 1.8+) переопределяется метод hashCode там образом:
Код:
public int hashCode() {
        return (y & 0xff) | ((x & 0x7fff) << 8) | ((z & 0x7fff) << 24) | ((x < 0) ? 0x0080000000 : 0) | ((z < 0) ? 0x0000008000 : 0);
    }
Зачем все так усложнять? Почему нельзя просто написать x + y + z?
 
x + y + z будет слишком активно коллизии выдавать, а здесь при координатах до 32768 вообще ни одной коллизии не будет.
 
Если вычисление хеш-кода сделать как x+y+z, то хеш-код у (1, 64, 0) и (0, 64, 1) будет одинаковый. Подобные совпадения плохо влияют на алгоритмы, использующие хеш-код. Например, производительность той же HashMap заметно упадет, если сделать вычисление хеш-кода так, как ты говоришь. Однако, ничего не сломается, даже если хеш-код везде на 0 поставить, просто работать медленнее будет.
 
Назад
Сверху