37-ичная система исчисления

Тема в разделе "Как сделать...", создана пользователем murich, 9 янв 2009.

Статус темы:
Закрыта.
  1. murich

    murich Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    143
    Симпатии:
    19
    если в качестве идентификатора мы будим использовать не только числа, но и англ. буквы + цифры - у нас будит гораздо больше вариантов.
    Интересует алгоритм, как можно перевести из десятичной системы исчисления в 37-ичную, используя в итоге латиницу и цифры

    Добавлено через 15 минут
    решение: http://avy.ru/programs/renum/
     
  2. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Алгоритм точно такой же, как и при переводе из десятеричной в шестнадцатиричную.
    Только букв в английском алфавите всего 26 + 10 цифр = 36, а не 37.

    А ещё можно использовать знаки препинания и прочее :D
    Только резонный вопрос - нахрена?
     
  3. murich

    murich Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    143
    Симпатии:
    19
    Обсчитался.

    Сервис укорачивания ссылок делаю :)
     
  4. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    А хэши чем не устраивают?
     
  5. B1rdEX

    B1rdEX Постоялец

    Регистр.:
    30 июн 2008
    Сообщения:
    141
    Симпатии:
    26
    Ты извращенец, одназначно.

    http://dev.mysql.com/doc/refman/5.0/en/numeric-types.html
    тебе мало возможностей bigint - от 0 до 18446744073709551615?
    Уверен, что даже при высокой популярности сервиса, за 5 (пять) лет и половины не истратится.
     
  6. murich

    murich Постоялец

    Регистр.:
    10 фев 2007
    Сообщения:
    143
    Симпатии:
    19
    Видимо у меня мало опыта чтобы тебя понять... Я не знаю, как я могу осуществить именно свою задачу при помощи хешей. Если можешь- расскажи.
    Все дело в длинне ссылки. Если использовать в качестве идентификатора ссылки число в десятичной системе то, к примеру, в 3 символах идентификатора вместится 10^3 вариантов, а при использовании системе с основанием 36 - уже 36^3 получат свою ссылку длинной не более 3 символов.
    В базе данных для идентификатора записи используется поле bigint, скрипт на лету переводит из одной системы исчисления в другую.
     
  7. Zander

    Zander Читатель

    Заблокирован
    Регистр.:
    6 авг 2007
    Сообщения:
    194
    Симпатии:
    36
    Ну и зачем для этого система счисления?
    Или над идентификаторами ссылок возможны арифметические действия?
    Чтобы выбрать следующий незанятый идентификатор, не надо преобразовывать в 37-ми (36-ти) -ричную систему счисления...
     
  8. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Надо, если ты хочешь получить вместо числа 123456 несколько букв/цифр (по аналогии с 65535 dec = FFFF hex).
     
  9. Zander

    Zander Читатель

    Заблокирован
    Регистр.:
    6 авг 2007
    Сообщения:
    194
    Симпатии:
    36
    Опишу как я понял задачу и ее возможное решение.
    На входе сервиса - длинная ссылка (строка), состоящая из произвольных символов, а не только из десятичных цифр.
    Ей в соответствие сервисом формируется короткая ссылка, содержащая только символы из тридцатишестисимвольного набора, которая получается не преобразованием исходной ссылки по неким правилам, а просто последовательным перебором доступных "слов" нового алфавита. (Ну, или если угодно, чисел в тридцатишестиричной системе).
    Соответствие длинной и короткой ссылки хранится в таблице БД.
    При этом не надо хранить идентификатор записи в виде bigint, идентификатором будет сама "короткая" ссылка. Все, что нужно сделать, это написать функцию increment_id, для получения следующего незанятого идентификатора.
     
  10. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Неправильно ты понял :D
    Ссылка - это набор символов, а не цифр, поэтому перевести её в какую либо систему счисления не получится.
    Поэтому ссылка заносится в БД и получает определённый id, допустим 7854223854.
    Вот этот id и переводится. В итоге вместо _http://www.supersite.com/user/foto/128.jpg получим _http://www.redirect.com/1D425F1EE (в шестнадцатиричной системе счисления, в 36-ричной будет ещё короче).
     
Статус темы:
Закрыта.