2010-11-23 22 views
3

Je travaille sur un raccourcisseur d'URL. L'entrée est une URL et la sortie doit être une chaîne de 4 caractères (alphanumérique, sensible à la casse). J'ai calculé que si j'utilise 4 caractères avec un espace clé alphanumérique sensible à la casse, je devrais potentiellement être capable de stocker 64^4 (16777216) URLs jusqu'à ce que je manque d'espace.Conception d'une bonne fonction de hachage pour raccourcir l'URL de longueur définie dans PHP

Je ne veux pas non plus que mon URL shortener génère des URL courtes qui sont des mots offensifs de quatre lettres. Il serait regrettable que quelqu'un fasse une petite URL qui soit domain.com/f**k. Vous obtenez la photo ...

Des idées sur la meilleure façon de faire à ce sujet? Je pense que je vais utiliser base64_encode quelque part dans le processus.

Répondre

3

Si j'étais vous, je ferais un incrémenteur alphanumérique sensible à la casse. Il suffit d'incrémenter et d'affecter le numéro à une ligne de base de données. Pour vérifier les mauvais mots, vérifiez simplement par rapport à une liste noire. Si ça passe, super. Si ce n'est pas le cas, il suffit d'incrémenter à nouveau. De cette façon, au lieu d'un algorithme de hachage, ils sont juste dans l'ordre. Les premiers ressembleraient à ceci:

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 

Et ainsi de suite.

est ici un indice sur la façon dont la fonction fonctionnera: http://us3.php.net/manual/en/function.ord.php

BTW, mes maths peut-être tort, mais je pense qu'il est (10 + 26 + 26)^4 = 14776336

Modifier : Juste pour le plaisir et le défi, j'ai écrit une fonction incrementer. Lorsque le maximum est atteint, il renvoie false, donc comparez-le à false (avec ===) lorsque vous l'utilisez.

http://pastebin.com/957KPn4p

+0

Hey Jonah - c'est tellement génial! Merci beaucoup pour votre excellente réponse. –

+0

Des pensées sur une fonction qui va recevoir l'une de ces valeurs et expulser l'entier qu'elle représente? =] –

+0

Je pourrais y penser, ... pourquoi? Si vous songez à l'index de la base de données, vous pouvez utiliser le numéro tel quel. – Jonah