Это что-то похожее на то, что Amazon использует для своих облачных активов, но использует 8 символов. На самом деле подходит 8 символов, так как это выходной диапазон после кодировки Base64 из 6 двоичных байтов.
Предполагая, что у вас есть возможность использовать 8 символов. В оригинальном вопросе вы сказали 6 символов, но снова предполагаете. Вот возможная схема:
- Укажите ваши активы в
Unsigned Int32
, возможно, с автоматическим приращением. назовите его real-id
. Используйте этот реальный идентификатор для всех своих внутренних целей.
- Когда вам нужно отобразить его, выполните следующие действия:
- Преобразуйте целое число в 4 двоичных байта. На каждом языке есть библиотека для извлечения байтов из целых чисел и наоборот. Звоните
real-id-bytes
- принять двухбайтовое случайное число. Снова вы можете использовать библиотеки для генерации точного случайного числа в 16 бит. Вы можете использовать криптографические генераторы случайных чисел для лучшего результата или просто
rand
. Назовите это rand-bytes
- Получить 6 байт
display-id-bytes
= array-concat(rand-bytes, real-id-bytes)
- Получить
display-id
= Base64(display-id-bytes)
. Это ровно 8 символов длинной и имеет сочетание строчных, прописных и цифр.
Теперь у вас есть, по-видимому, случайный 8-значный display-id
, который может быть отображен на real-id
. Для того, чтобы преобразовать обратно:
- Возьмите 8 символов
display-id
display-id-bytes
= Base64Decode(display-id)
real-id-bytes
= Discard-the-2-random-bytes-from(display-id-bytes)
real-id
= fromBytesToInt32(real-id-bytes)
Простой. Теперь, если вы действительно не можете пойти на 8-char display-id, тогда вам нужно разработать собственный пользовательский base-64, похожий на algo. Также вы можете ограничить себя только одним случайным байтом. Также обратите внимание, что это всего лишь схема кодирования, а не схема шифрования. Поэтому любой, кто знает вашу схему, может эффективно разбить/декодировать идентификатор. Вам нужно решить, приемлемо это или нет. Если нет, то я думаю, вам нужно сделать некоторую форму шифрования. Что бы это ни было, наверняка 6-символов будет недостаточно.
6 символов - это жесткий предел, или вы можете быть гибким, как 8 символов или 10 символов? – inquisitive
@inquisitive извините за мой поздний ответ, и да: 6 был всего лишь примером, 8 символов полностью прекрасны – plunntic