@alekssamos
Программист любитель

Как сделать буквенные ID?

Я однажды видел такой сокращатель URL: /1, /2, /9, /a, /b, /z, /A, /Z, /1a, /2a ...?
Как такое сделать? Кто-то говорил про 64 ричную систему счисления, но давно было, не помню.
Было это на link.theshortcuts.pro . Там сначала одна цифра, затем одна буква, когда цифры закончились, затем одна цифра + одна буква. И так далее.
  • Вопрос задан
  • 142 просмотра
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Просто 62-ричная позиционная система счисления с алфавитом 0-9a-zA-Z.
<?php
$alphabet62 = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
function toAlphabet(int $decimal, string $alphabet) : string
{
  $base = mb_strlen($alphabet);
  $result = '';
  do {
    $pos = $decimal % $base;
    $result  = mb_substr($alphabet, $pos, 1) . $result;
    $decimal = intdiv($decimal, $base);
  } while ($decimal > 0);
  return $result;
}
var_dump(toAlphabet(12345678, $alphabet62));
// string(4) "PNFQ"
var_dump(toAlphabet(12345678, '0aA'));
// string(15) "AaA0A00A000Aa00"
Ответ написан
dyuriev
@dyuriev
A posteriori
Не совсем понятно причем тут MySQL)

10 цифр + 26 букв нижнего регистра + 26 букв вернего регистра - это 62 ричная система счисления.

через php-gmp можно:

<?php
  $id = '8472076875';
  echo 'original ' . $id . PHP_EOL;

  $id62 = gmp_strval(gmp_init($id, 10),62); // преобразовываем из 10-чной в 62-ричную
  echo '10to62   ' . $id62 . PHP_EOL;

  $id2 = gmp_strval(gmp_init($id62, 62),10); // преобразовываем из 62-ричной обратно в 10-чную
  echo '62to10   ' . $id2 . PHP_EOL;
?>
результат:
original 8472076875
10to62   9FLyDD
62to10   8472076875


если буквы верхнего регистра не очень нужны, то можно через base_convert(); в 36-ричную для этой функции предел как раз 36)

PS: преимущество gmp над реализацией метода через чистый php - феноменальная скорость. Тот же код что и в моем примере выше с 80-значным числом отработал на мобильно i5 меньше чем за пол секунды:
$ time php test.php 
original 23401823413248776823465324564823758974652738496528934652984564235623845698234763
10to62   3BshjdyAzgaTxTiw0zqLRs58vHoKHBrnQmTdcE9NCRiEl
62to10   23401823413248776823465324564823758974652738496528934652984564235623845698234763


real	0m0.493s
user	0m0.106s
sys	0m0.108
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы