Создать уникальный идентификатор из уникального ввода строки - PullRequest
2 голосов
/ 03 февраля 2010

У меня есть таблица со столбцом уникальных строковых значений. Максимальная длина строкового значения составляет 255 символов. Я хочу создать уникальный идентификатор со строковым значением в качестве входных данных. Другими словами, я ищу компактное представление для строки. Сгенерированный уникальный идентификатор может быть буквенно-цифровым. Полезной функцией будет возможность регенерировать строковое значение из уникального идентификатора.

Есть ли эффективная функция для генерации такого уникального идентификатора. Некоторые способы могут использовать контрольную сумму или хэш-функции. Я хочу знать, есть ли стандартный способ сделать это.

Я использую базу данных MySql и Java.

Спасибо!

- редактировать: я ищу более компактное представление, а не просто использование самой строки.

Ответы [ 8 ]

4 голосов
/ 03 февраля 2010

Насколько уникален "уникальный"?Использование любой хорошей функции хеширования (MD5 подходит для большинства применений и легко реализуется через java.security.MessageDigest.getInstance ("MD5") может получить 128-битное число, которое очень вероятно будет уникальным.хеш дает вам меньший идентификатор с большей вероятностью коллизии.

Использование поля auto_increment в БД, если оно соответствует вашему дизайну, может быть проще в реализации, действительно гарантирует уникальность и будет использовать меньшееИдентификаторы, превышающие 16 байтов MD5. Затем вы также можете выполнить требование поиска строки по ключу, чего нельзя сделать для хэша.

2 голосов
/ 03 февраля 2010

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

A-Z - 26 символов, что меньше 32 (5 бит)

добавьте a-z, и это будет 6 бит (где осталось около 12 битовых комбинаций для представления других символов).

Допустим, вам этого достаточно. Таким образом, у вас есть 6x255 битов, что составляет 1530 битов для хранения вашей строки. (191 байт)

Использование только заглавных букв уменьшило бы это немного (до 159 байт)

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

Если вы не можете дополнительно указать содержимое строк, вы просто не получите то, что хотите. Сожалею. (Если вы можете рассказать больше о содержимом строк, сделайте это. Один из нас может увидеть шаблоны, которые позволят гораздо лучше «Сжатие»)

Это отсутствие способности делать то, что вы хотите, поэтому хеш-таблицы так круты. Они получают «В основном уникальное» число, а затем имеют второй уровень разрешения для проверки случаев, когда две строки хэшируются на одно и то же число.

1 голос
/ 03 февраля 2010

Поскольку вы используете MySQL, взгляните на CRC32

http://www.bitbybit.dk/carsten/blog/?p=191

1 голос
/ 03 февраля 2010

У вас гораздо больше возможностей для длинной строки 255, чем для 64-битного (или любого другого) длинного числа. Это невозможно. Добавьте поле auto_increment.

1 голос
/ 03 февраля 2010

Если ваша база данных требует, чтобы столбец содержал уникальные значения, то почему бы не использовать саму строку? Все остальное - это просто еще один шаг для его кодирования / декодирования.

0 голосов
/ 30 августа 2012

Выбор правильного ключа не должен быть легким.

Вам необходимо учесть:

  • Репликация: необходимо ли разделение ключей между различными серверами?Если это так, то вам, скорее всего, нужен какой-то уникальный хеш или guid.

  • Размер таблицы / количество вставок: вам следует учитывать, что большинство rdbms физически хранят данные на жестком диске.по порядку их (кластеризованного) первичного ключа.Теперь представьте, что произойдет, если вы вставите хеш-значение, начинающееся с «a», в таблицу с разумным размером.Да, есть заполнение индекса, но в конечном итоге его заполнение и вставка в одну строку могут привести к перемещению пары ГБ на жестком диске.

  • Нужна репликация И есть большие таблицы?Используйте оба.Используйте первичный кластеризованный ключ целого автоматического увеличения (длинный) и определите уникальный индекс в вашем хеш-столбце.

0 голосов
/ 03 февраля 2010

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

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

Если вам не нужно извлекать оригинал, вам нужна хеш-функция, такая как MD5.

0 голосов
/ 03 февраля 2010
public String getUniqueId(String uniqueString) {
    return uniqueString;
}

Если идентификатор не имеет каких-либо других ограничений, кроме "быть уникальным".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...