Если у вас есть несколько числовых значений и вам нужно иметь одно «уникальное» (то есть статистически невероятное дублирование) значение из них, вы обычно можете использовать формулу, например:
h = (a*P1 + b)*P2 + c
где P1 и P2 - либо правильно выбранные числа (например, если вы знаете, что «a» всегда находится в диапазоне 1–31, вы можете использовать P1 = 32), либо, когда вы ничего не знаете о допустимых диапазонах , b, c Наилучший подход состоит в том, чтобы P1 и P2 были большими простыми числами (у них меньше всего шансов генерировать конфликтующие значения).
Для оптимального решения математика немного сложнее, но, используя простые числа, вы обычно можете найти достойное решение.
Например, реализация Java для .hashCode()
для массива (или строки) выглядит примерно так:
h = 0;
for (int i = 0; i < a.length; ++i)
h = h * 31 + a[i];
Даже если лично я бы выбрал простое число больше 31, так как значения внутри строки могут легко сталкиваться, так как дельта из 31 места может быть довольно распространенной, например, :
"BB".hashCode() == "Aa".hashCode() == 2122