Как сопоставить строковые ключи уникальным целочисленным идентификаторам? - PullRequest
0 голосов
/ 17 апреля 2010

У меня есть некоторые данные, которые регулярно поступают в виде дампа из источника данных со строковым естественным ключом, который длинен (до 60 символов) и не имеет отношения к конечному пользователю. Я использую этот ключ в URL. Это делает URL слишком длинными и недружелюбными для пользователя.

Я хотел бы преобразовать строковые ключи в целые числа со следующими требованиями:

Исходный набор данных будет меняться со временем.

Идентификатор должен быть:

  • неотрицательное целое число
  • уникальный и постоянный, даже если набор клавиш ввода изменяется
  • предпочтительно обратимый назад к ключу (не сильное требование)

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

В настоящее время существует около 30000 различных ключей, и набор постоянно растет.

Как реализовать функцию, которая будет отображать строковые ключи в целочисленные идентификаторы?

О чем я думал:

1. Встроенная строка. GetHashCode:

ID(key) = Math.Abs(key.GetHashCode())

  • не гарантируется быть уникальным
  • (необратимый)

1.1 «Повторное хэширование» встроенного GetHashCode до тех пор, пока не будет создан уникальный идентификатор для предотвращения коллизий.

  • существующие идентификаторы могут измениться, если в начало набора входных данных будет добавлено что-то противоречащее

2. идеальная функция хеширования

  • Я не уверен, может ли это генерировать постоянные идентификаторы, если набор входов изменится
  • (необратимый)

3. Перевести на базу 36/64 / ??

  • недостаточно укорачивает длинные ключи

Какие есть другие варианты?

Ответы [ 3 ]

1 голос
/ 17 апреля 2010

Это можно сделать только в том случае, если вы можете сохранить список назначенных идентификаторов.

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

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

1 голос
/ 17 апреля 2010

Sha1sum в кодировке Base64 - это 27 символов. base64 (md5 (...)) - 22 символа. Любой меньше, и вы будете иметь незначительный риск столкновения.

Идеальные функции хеширования невозможны при изменении набора входов.

0 голосов
/ 17 апреля 2010

Настройте вторую постоянную БД и сохраните там свои пары KEY / ID. Убедитесь, что у вас также есть дата данных в таблице, чтобы вы могли вести домашнюю работу.

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