как создать уникальное целое число из 3 различных целочисленных чисел (1 Oracle Долго, 1 Поле даты, 1 Короткое)

Одной вещью, которая укусила многих при использовании EJBs или J2EE в целом, является зависимость от сервера приложений, Вы работаете на своем EJBs. appserver имеет тенденцию поддерживаться для определенного набора выпусков операционной системы и версий JVM. Наличие исходного кода к значительной части Вашей среды выполнения могло также превратиться в проблему.

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

Однако appservers, которому я был представлен, может обработать очень много злоупотребления от кода, работающего в нем, и работать очень хорошо.

10
задан yli 31 August 2009 в 17:30
поделиться

2 ответа

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

h = (a*P1 + b)*P2 + c

где P1 и P2 являются либо хорошо подобранными числами (например, если вы знаете, что «a» всегда находится в диапазоне 1-31, вы можете использовать P1 = 32), либо, когда вы ничего не знаете о допустимых диапазонах a, b, c лучший подход - иметь P1 и P2 как большие простые числа (у них меньше всего шансов генерировать значения, которые конфликтуют). Для оптимального решения математика немного сложнее, но, используя простые числа, вы обычно можете получить достойное решение.

Например, реализация Java для .hashCode () для массива (или a String) выглядит примерно так:

h = 0;
for (int i = 0; i < a.length; ++i)
    h = h * 31 + a[i];

Хотя лично я бы выбрал простое число больше 31, поскольку значения внутри String могут легко конфликтовать, поскольку дельта из 31 разряда может быть довольно обычным явлением, например:

"BB".hashCode() == "Aa".hashCode() == 2122
15
ответ дан 3 December 2019 в 20:43
поделиться

Вашу

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

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

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

00012 001 --> 00012001
00001 012 --> 00001012
3
ответ дан 3 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: