Как создать уникальный буквенный id для каждой записи?

В таблицу mysql нужно добавлять записи, есть колонка u_id
нужно при каждом добавлении добавлять уникальный u_id типа x3w9 к каждой записи

u_id от 4 символов, a-Z 0-9 (по мере заполнения всех 4 символьных вариаций - переход к 5 символьным и т.д.)

Подскажите как реализовать? я понимаю можно заранее генерировать и проверять существование, если существует - опять генерировать, далее опять проверять существование - но допустим когда почти все 4 символьные вариации начнут заканчиваться - то получается повторных проверок может быть тысячи и как избежать этого и как понять что закончились 4 символьные вариации и перейти к 5 символам?

вообще что мне нужно - есть каталог на сайте, id идут по возрастанию - 1229 - 1230 - 1231 и т.д.
мне нужно скрыть это возрастание и получить скрытые id типа x3w9 j29f 0use

заранее скажу хеши не подойдут, нужны короткие id

я вот сейчас понял что у сервисов коротких URL такие же id, как у них реализовано это?
  • Вопрос задан
  • 1159 просмотров
Пригласить эксперта
Ответы на вопрос 4
mlnkv
@mlnkv
JavaScript Developer
www.sitepoint.com/building-your-own-url-shortener
я не сильный знаток английского, перевел как смог)
<?php

protected static $chars = "123456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ";

...

# конвертируем id записи в короткую численно буквенную строку
protected function convertIntToShortCode($id) {
  $id = intval($id);
  if ($id < 1) {
    throw new Exception("ID не является целочисленным значением");
  }

  $length = strlen(self::$chars);
  # убедитесь, что длина доступных символов достаточна - 
  # там должно быть по крайней мере 10 символов
  if ($length < 10) {
    throw new Exception("Слишком мало символов");
  }

  $code = "";
  while ($id > $length - 1) {
    # определить значение следующего высшего 
    # символа который должен быть добавлен в строку
    $code = self::$chars[fmod($id, $length)] . $code;
    # сбросить $id до значения остатка для дальнейщего преобразования
    $id = floor($id / $length);
  }

  # остаточное значение $id меньше чем длина self::$chars
  $code = self::$chars[$id] . $code;

  return $code;
}

...

?>


function convertIntToShortCode(id) {
  var chars = '123456789bcdfghjkmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ',
    code = '';
  id = parseInt(id);

  if (isNaN(id)) throw Error('The "id" is not a valid integer');

  while (id > chars.length - 1) {
    code = chars[id % chars.length] + code;
    id = Math.floor(id / chars.length);
  }

  return chars[id] + code;
}
Ответ написан
Bahusss
@Bahusss
Python Master
Попробуйте hashids.org, библиотека позволяет генерировать уникальные последовательности символов с заданным алфавитом для произвольных integer значений.
Ответ написан
Комментировать
Sanasol
@Sanasol Куратор тега PHP
нельзя просто так взять и загуглить ошибку
Так делают всякие MongoDB.

stackoverflow.com/questions/16737910/generating-a-...

Самый простой вариант:
MD5(1) = c4ca4238a0b923820dcc509a6f75849b => c4ca4238
MD5(2) = c81e728d9d4c2f636f067f89cc14862c => c81e728d
MD5(3) = eccbc87e4b5ce2fe28308fd9f2a7baf3 => eccbc87e
Ответ написан
Сталкивался с аналогичной задачей. Тут два варианта:
1) блочный шифр, однако тут придется реализовывать его самостоятельно, чтобы можно было выполнить условия, что сначала использует 4 символьные строки, потом 5 символьные и тд.
2) Заранее сгенерировать все возможные 4 символьные коды и перемешать, сделать вставку в базу, а потом использовать, когда 4 символьные подойдут к концу сгенерировать 5 символьные.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы