Youtube хэши в стиле URL - PullRequest
       18

Youtube хэши в стиле URL

4 голосов
/ 10 февраля 2010

Я пытаюсь выяснить, как создавать красивые и короткие буквенно-цифровые хэши, подобные тем, которые используются в URL-адресах YouTube.

Пример: http://www.youtube.com/watch?v=rw71YOSXhpE

Где rw71YOSXhpE конвертирует в видео номер 12834233 (например).

Эти целые числа можно преобразовать в PHP в целое, а затем найти в базе данных.

Я запустил следующее в PHP:

<?
$algoList = hash_algos( );

foreach( $algoList as $algoName )
{
    echo $algoName . ": " . hash( $algoName, 357892345234 ) . "\n";
}
?>

Но никто из них не возвращается с персонажами, превосходящими a-f, которого вы ожидаете. У YouTube есть весь английский алфавит в верхнем и нижнем регистре. Есть идеи, как они это сделали?

Ответы [ 5 ]

6 голосов
/ 10 февраля 2010

Вы хотите преобразовать целое число в другую базу, в которой используется полный алфавит. Base64 может работать, но вы получите строки, которые длиннее исходного целого числа, потому что функция base64_encode () принимает строку, а не целое число.

Я бы предложил использовать функцию base_convert () следующим образом:

$id = 12834233;
$hash = base_convert($id, 10, 36);

и наоборот

$hash = '7n2yh'
$id = base_convert($hash, 36, 10);

Однако при этом будут использоваться только строчные буквы a-z и 0-9. Если вы хотите использовать все заглавные и строчные буквы, вам нужно преобразовать в основание 62 (или выше, если вы используете символы). Однако для этого вам придется написать собственный код.

Редактировать : Гордон указал на эту замечательную ссылку на кодировку base62 в php.

5 голосов
/ 04 сентября 2012

У меня была похожая проблема, и я специально для этого написал для себя класс.

Документация: http://www.hashids.org/php/

Соус: https://github.com/ivanakimov/hashids.php

Вы бы использовали это так:

require('lib/Hashids/Hashids.php');

$hashids = new Hashids\Hashids('salt value', 11);
$hash = $hashids->encrypt(12834233);

Вы получите следующее $hash: Rz0zlKZGg6g

Укажите вашу собственную уникальную строку для значения соли. 11 в коде является необязательным и обозначает минимальную длину хеша. (Вы также можете определить свою собственную строку алфавита как третий параметр конструктора).

Чтобы расшифровать хеш, вы должны сделать это:

$numbers = $hashids->decrypt($hash);

Так $numbers будет: [12834233]

(Это массив, потому что хеш-коды могут шифровать / дешифровать несколько чисел в один хеш.)

EDIT

  1. Изменены URL-адреса для включения как сайта документации, так и исходного кода
  2. Изменен пример кода для адаптации к основным обновлениям библиотеки (текущая версия PHP для PHP - 0.3.0 - спасибо всему сообществу разработчиков открытого исходного кода за улучшение библиотеки)
5 голосов
/ 10 февраля 2010

Вы можете использовать base_convert () для преобразования вашего числа в основание 36, которое использует 0-9 плюс a-z, и имеет то преимущество, что ваш параметр URL не учитывает регистр.

0 голосов
/ 10 февраля 2010

вероятно, кодировка base64 (часть) md5? хотя я помню, что есть короткие и длинные, так что это может быть md5 или sha1. если вы base64 декодируете полученный токен с правильным заполнением, результатом будет 8-битный объект, так что это не полный md5. Это может быть только первая половина.

0 голосов
/ 10 февраля 2010

Нечто подобное можно сделать с base64_encode().

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