У меня есть целочисленный тип, скажем long
, значения которого находятся междуLong.MIN_VALUE = 0x80...0
(-2^63 )иLong.MAX_VALUE = 0x7f...f
(2^63 -1 ). Я хочу хешировать его с ~50% столкновением с положительным целым числом того же типа (, то есть между 1 иLong.MAX_VALUE
)чистым и эффективным образом.
Мои первые попытки были примерно такими:
Math.abs(x) + 1
(x & Long.MAX_VALUE) + 1
но у тех и подобных подходов всегда есть проблемы с определенными значениями, т.е. когда x
равно 0
/Long.MIN_VALUE
/Long.MAX_VALUE
. Конечно, наивным решением будет использовать 2 оператора if, но я ищу что-то чище/короче/быстрее. Любые идеи?
Примечание :Предположим, что я работаю на Java, где нет неявного преобразования в логическое значение и определена семантика сдвига.