Разработка хорошей хеш-функции для сокращения заданной длины URL-адреса в PHP

Я работаю над сокращением URL-адресов. Входными данными является URL-адрес, а выходными данными должна быть 4-символьная строка (буквенно-цифровая, с учетом регистра).

Я подсчитал, что если я использую 4 символа с чувствительным к регистру буквенно-цифровым ключевым пространством, я потенциально смогу хранить 64 ^ 4 (16777216) URL-адресов, пока у меня не закончится место.

Я также не хочу, чтобы мой сокращатель URL генерировал какие-либо короткие URL-адреса, содержащие оскорбительные четырехбуквенные слова. Было бы прискорбно, если бы кто-то сделал короткий URL-адрес domain.com/f**k. Вы уловили картину ...

Есть идеи, как лучше всего это сделать? Мне кажется, что где-то в процессе я буду использовать base64_encode.


person Kirk Ouimet    schedule 23.11.2010    source источник


Ответы (2)


На вашем месте я бы сделал буквенно-цифровой инкремент с учетом регистра. Просто увеличьте и присвойте номер строке базы данных. Чтобы проверить, нет ли плохих слов, просто сверьтесь с черным списком. Если пройдет - отлично. Если нет, просто увеличьте снова.

Таким образом, вместо хеш-алгоритма они в порядке. Первые несколько выглядели бы так:

id   | url
-------------------------
0000 | http://google.com
0001 | http://yahoo.com
0002 | http://example.com
...
000a | http://mail.google.com
000b | http://adobe.com
...
000A | http://microsof.com
...
0010 | http://w3.org
...
00a0 | http://youtube.com
...
00A0 | http://stackoverflow.com

И так далее.

Вот подсказка о том, как будет работать эта функция: http://us3.php.net/manual/en/function.ord.php

Кстати, моя математика может быть неправильной, но я думаю, что это (10 + 26 + 26) ^ 4 = 14776336

Редактировать: просто для удовольствия и задачи я написал функцию инкрементатора. Когда достигается максимум, он возвращает false, поэтому просто сравните его с false (с ===) при его использовании.

http://pastebin.com/957KPn4p

person Jonah    schedule 23.11.2010
comment
Привет, Иона, это так здорово! Большое спасибо за отличный ответ. - person Kirk Ouimet; 24.11.2010
comment
Есть какие-нибудь мысли о функции, которая получит одно из этих значений и выбьет целое число, которое оно представляет? знак равно - person Kirk Ouimet; 25.11.2010
comment
Я мог подумать об этом ... почему? Если вы думаете об индексе базы данных, вы можете использовать номер как есть. - person Jonah; 25.11.2010

Это смутно напомнило мне этот Как мне создать уникальные идентификаторы, такие как YouTube?. Вам просто нужно обязательно проверить (в более ограниченном пространстве) возможность столкновения.

person Dimitrios Mistriotis    schedule 23.11.2010