Хэши в стиле URL-адреса Youtube

Я пытаюсь выяснить, как создавать красивые и короткие буквенно-цифровые хэши, подобные тем, которые используются в 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";
}
?>

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


person Mark L    schedule 10.02.2010    source источник
comment
Nitpick: Поскольку вы можете изменить его, это не хэш, а скорее кодировка.   -  person Heinzi    schedule 10.02.2010
comment
Youtube теперь использует базу 64   -  person Flyswat    schedule 22.05.2015


Ответы (5)


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

person Heinzi    schedule 10.02.2010

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

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

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

и наоборот

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

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

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

person bramp    schedule 10.02.2010

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

Документация: 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]

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

ИЗМЕНИТЬ:

  1. Изменены URL-адреса, чтобы включить как веб-сайт документа, так и источник кода.
  2. Изменен код примера, чтобы приспособиться к основным обновлениям библиотеки (текущая версия библиотеки PHP — 0.3.0 — спасибо всему сообществу разработчиков открытого исходного кода за улучшение библиотеки)
person ivanakimov    schedule 04.09.2012
comment
Я имею в виду хеш-строку символов. Почему они не могут быть расшифровываемыми и уникальными одновременно? - person ivanakimov; 04.09.2012
comment
:) Я думаю, вы больше ориентируетесь на слово, чем на код. Вы можете назвать это хешем, или идентификатором, или как вам больше нравится. И если вы внимательно посмотрите на ответ, я утверждаю, что 11 — это минимальная длина хеша — некоторые символы там просто для заполнения. - person ivanakimov; 04.09.2012
comment
Я думаю, вы просто оценили меня по формулировке (с которой вы не согласны), а не по решению исходной проблемы, с которой я пытался помочь. Я также думаю, что стоит взглянуть на код (который является открытым исходным кодом), прежде чем обвинять меня в ложной статистике чего-либо. Кажется немного несправедливым. - person ivanakimov; 04.09.2012
comment
Я сказал минимальную длину хеша, а не точную длину хеша. И веб-сайт указывает на страницу документации, на которой нет и не будет рекламы — на самом деле ее размещение стоит мне денег. (отредактировал сообщение, чтобы обновить примеры до последней библиотеки Hashids, а также ссылку на источник github) - person ivanakimov; 19.02.2013
comment
Если ваша цель — выиграть любой спор (поскольку вы прыгаете от одного к другому), мы можем комментировать здесь вечно. Я уже говорил вам, что слово хеш используется в широком смысле для обозначения того, о чем писал ОП, а не чисто криптографическим способом. - person ivanakimov; 19.02.2013
comment
Просто заметка. Строки, которые были обработаны md5, делают хэши всего на 2-3 символа короче, поэтому, вероятно, стоит где-то упомянуть об этом в документации. - person Anton Babenko; 07.10.2013

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

person Ignacio Vazquez-Abrams    schedule 10.02.2010
comment
Но base64 включает такие символы, как '=' - person Mark L; 15.02.2010

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

person Stefano Borini    schedule 10.02.2010