У меня есть некоторые данные, которые регулярно поступают в виде дампа из источника данных со строковым естественным ключом, который длинен (до 60 символов) и не имеет отношения к конечному пользователю. Я использую этот ключ в URL. Это делает URL слишком длинными и недружелюбными для пользователя.
Я хотел бы преобразовать строковые ключи в целые числа со следующими требованиями:
Исходный набор данных будет меняться со временем.
Идентификатор должен быть:
- неотрицательное целое число
- уникальный и постоянный, даже если набор клавиш ввода изменяется
- предпочтительно обратимый назад к ключу (не сильное требование)
База данных каждый раз перестраивается с нуля, поэтому я не могу вспомнить уже назначенные идентификаторы, сопоставить новый набор данных с существующими идентификаторами и создать последовательные идентификаторы для добавленных ключей.
В настоящее время существует около 30000 различных ключей, и набор постоянно растет.
Как реализовать функцию, которая будет отображать строковые ключи в целочисленные идентификаторы?
О чем я думал:
1.
Встроенная строка. GetHashCode:
ID(key) = Math.Abs(key.GetHashCode())
- не гарантируется быть уникальным
- (необратимый)
1.1
«Повторное хэширование» встроенного GetHashCode до тех пор, пока не будет создан уникальный идентификатор для предотвращения коллизий.
- существующие идентификаторы могут измениться, если в начало набора входных данных будет добавлено что-то противоречащее
2.
идеальная функция хеширования
- Я не уверен, может ли это генерировать постоянные идентификаторы, если набор входов изменится
- (необратимый)
3.
Перевести на базу 36/64 / ??
- недостаточно укорачивает длинные ключи
Какие есть другие варианты?