Как создать уникальное целое число из 3 различных целых чисел (1 Oracle Long, 1 Date Field, 1 Short) - PullRequest
9 голосов
/ 31 августа 2009

дело в том, что 1-й номер уже ORACLE LONG, второй - Дата (SQL DATE, без дополнительной информации о отметке времени), последний - значение Short в диапазоне 1000-100'000.
Как я могу создать вид хэш-значения, которое будет оптимально уникальным для каждой комбинации?

конкатенация строк и преобразование в длинные:
Я не хочу этого, например.

День Месяц

12 1 -> 121
1 12 -> 121

Ответы [ 2 ]

15 голосов
/ 01 сентября 2009

Если у вас есть несколько числовых значений и вам нужно иметь одно «уникальное» (то есть статистически невероятное дублирование) значение из них, вы обычно можете использовать формулу, например:

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
3 голосов
/ 31 августа 2009

Ваш

12 1  --> 121
1 12  --> 121

Проблема легко решается путем добавления нуля к числам ввода до максимальной ширины, ожидаемой для каждого поля ввода.

Например, если первое поле может находиться в диапазоне от 0 до 10000, а второе поле может находиться в диапазоне от 0 до 100, ваш пример становится следующим:

00012 001 --> 00012001
00001 012 --> 00001012
...