Ответ 1
В основном это XOR - верхние 32 бита длинной с нижними 32 битами. Здесь взорванная версия:
// Unsigned shift by 32 bits, so top 32 bits of topBits will be 0,
// bottom 32 bits of topBits will be the top 32 bits of l
long topBits = l >>> 32;
// XOR topBits with l; the top 32 bits will effectively be left
// alone, but that doesn't matter because of the next step. The
// bottom 32 bits will be the XOR of the top and bottom 32 bits of l
long xor = l ^ topBits;
// Convert the long to an int - this basically ditches the top 32 bits
int hash = (int) xor;
Чтобы ответить на ваш комментарий: у вас есть длинное значение, которое должно быть преобразовано в int, чтобы быть частью хэша (результат должен быть только 32 бита). Как вы это сделаете? Вы могли бы просто взять нижние 32 бита - но тогда это означает, что изменения только в верхних 32 битах будут проигнорированы, что не сделает его очень хорошим хешем. Таким образом, изменение одного бита ввода всегда приводит к изменению одного бита хэша. По общему признанию, вы все равно можете легко получить столкновения - измените, например, как биты 7, так и 39, или любую другую пару битов 32, расположенных отдельно друг от друга, - но это связано с тем, что вы переходите от 2 64 возможные значения до 2 32.