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

Я хочу создать уникальный идентификатор, который будет использоваться в URL-адресах для идентификации конкретного ресурса. В принципе это то же самое, что и pastebin.com и т. Д.

Идентификатор и ресурс не очень секретны, но я хочу, чтобы это было так, чтобы вы просто не могли уменьшить идентификатор и затем получить ресурс другого пользователя. Я думаю о CHAR(8), который будет хорошо смотреться в URL и при этом быть достаточно большим, чтобы уменьшить вероятность угадывания. Но как мне это сгенерировать? Для INT вы можете использовать auto_increment и primary key для обеспечения уникальности.

Но если я сделаю следующее в порядке

  1. Создайте CHAR(8) в моем приложении
  2. Убедитесь, что этот идентификатор не существует.
  3. Если его не существует, сохраните, иначе перейдите к 1.

Я должен заключить 2. и 3. в атомарную транзакцию.

Но есть ли лучший способ? или я не должен заботиться о проверке (2.), потому что конфликт не происходит регулярно. Я использую MySql и .Net (C #), если это помогает. Можно ли каким-то образом «зашифровать» автоматически инкрементный int в качестве text-id и снова расшифровать его точно в 8 (или 10) символов.

Я прочитал Нужна меньшая альтернатива GUID для идентификатора БД, но все еще уникальная и случайная для URL , что было полезно, но использование GUID не поддерживается в MySql (насколько я знаю). Но приветствуется также комментарий о качестве метода LongToShortCode в теме.

Примечание: ресурсы не могут быть изменены, только просмотрены.

С уважением, Лассе

Ответы [ 4 ]

1 голос
/ 26 августа 2010

MySql реализует UUID.Который, кажется, GUID с другим именем.Таким образом, эта опция все еще доступна для вас.

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

1 голос
/ 26 августа 2010

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

0 голосов
/ 28 августа 2010

Я думаю, я сделаю это так: Текстовый идентификатор из 8 символов может хранить число до 64 ^ 8 = 2 ^ 48.

Затем я буду использовать два столбца:

  • ID, INT 2 ^ 32, автоинкремент
  • Rand, INT 2 ^ 16

Затем, когда я добавлю строку, я сгенерирую случайное целое число 2 ^ 16 и поместу его в новую строку. Текстовый идентификатор тогда просто генерируется из двух чисел, объединенных. И поиск легко два - просто разделить его и простой поиск в базе данных. Смешное простое решение, которое должно устранить столкновения строк и быть достаточно случайным (2 ^ 16), чтобы уменьшить догадки.

Отзывы об этом подходе будут оценены.

0 голосов
/ 26 августа 2010

Самый простой способ сделать это псевдоатомно - это

  1. генерирует случайную строку
  2. сохранить строку (фактически резервируя ее)
  3. проверить, существует ли другой
  4. если другой существует, удалите тот, который вы только что сделали, и вернитесь к шагу 1

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

РЕДАКТИРОВАТЬ: Я бы предложил взять первые несколько символов криптографического хэша или что-то для функции генерации, но это не имеет значения.

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