2014-09-18 4 views
1

Я хотел бы преобразовать строку (из файла XML) в основной ключ базы данных.Java - Преобразование строк для базового ключа DB

В частности, я хотел бы удостовериться, что это значение уникально, все положительные и уважают спецификацию первичного ключа БД: NUMBER (9).

Строка, я пытаюсь преобразовать имеют следующую характеристику:

PDR_20140909150001

Очевидно, я могу игнорировать первую часть строки (так как одни и те же для всех файлов), но я должны преобразовать строку временной метки, например 20140909150001, в значение int, которое должно иметь максимум 9 цифр длины.

Как я могу это сделать?

ответ

2

Вы не можете использовать любой хэш-функции в качестве первичного ключа из-за хэш-функции природы: оно сюръективно и не может быть уникальным.

+0

Спасибо! У вас есть хорошая идея? – Zany

+0

Существует много механизмов для создания первичных ключей: часть из них реализована в самом db – Andremoniy

+0

Я не могу прикоснуться к db, я просто могу работать на стороне программного обеспечения – Zany

1

В теории хэши создаются, чтобы избежать столкновений как можно больше, но ни один из них не может быть уникальным. Тем более что в очень строгих требованиях 9 чисел. Это не сработает.

Либо используйте последовательность базы данных или UUID.

+0

Спасибо! У вас есть идея, что в программной части я могу развиваться? – Zany

+0

Если вам нужен ключ, сгенерированный вашим программным обеспечением, используйте UUID.randomUUID(), который генерирует UUID типа 4. При необходимости возможны другие типы. Наиболее оптимальный сценарий (по крайней мере, в некоторых базах данных, таких как oracle) - это сохранение UUID в качестве исходного. – nablex

+0

Если вы не можете обновить тип от числа (9) до raw/varchar и не можете добавить генератор последовательности в базу данных, вы по существу завинчиваетесь. Создание уникальных номеров из программного обеспечения (я предполагаю, что это кластерная настройка) является трудной проблемой – nablex

0

Что вам нужно - это биективная функция Integer to String, которая обсуждается here.

+0

Просто обратите внимание, что это не обязательно должно быть биективным, инъективным будет достаточно (теоретически, что биективная функция может быть более эффективной с точки зрения памяти, но не нужна) – LionC

1

Я бы назвал ваш «хэш-код» a трансформацией скорее.

В общем, вы не можете сделать такое преобразование, потому что если String является долго достаточно (например, более 10 символов), есть больше возможных значений в этой строке, чем число с 9 цифр могут представлять.

IF Вводная строка гарантированно короче предела, вы можете сделать такое преобразование. Максимальный входной предел составляет 2 символа, потому что 1 символ в Java - 16 бит, который равен 2 байтам, 3 символа будут 6 байтов (что не соответствует NUMBER(9)). Максимальное значение NUMBER(9) - 999999999, которое равно 0x3B9AC9FF, что составляет 4 байта.

Конверсия:

String key = ...; // Read key, must be 2 characters at the most 

int dbKey = 0; // NUMBER(9) fits into a Java int 
for (int i = 0; i < key.length(); i++) { 
    dbKey <<= 16; 
    dbKey += key.charAt(i); 
} 
+0

you ' Верно! но, может быть, лучше, если я открою вопрос более конкретно. – Zany

Смежные вопросы