Je suis intéressé par la création de minuscules URL comme des liens. Mon idée était de simplement stocker un identifiant d'incrémentation pour chaque URL long posté, puis de convertir cet identifiant à la variante de base 36, comme les suivantes dans PHP:
$tinyurl = base_convert($id, 10, 36)
9 Réponses :
Je voudrais simplement CRC32 URL
$url = 'http://www.google.com'; $tinyurl = hash('crc32', $url ); // db85f073
J'aime cette idée, mais le code de 8 caractères est un problème - avec des raccourcis d'URL ces jours-ci, chaque personnage compte et 8 est un peu élevé.
Ceci est vraiment bon marché, mais si l'utilisateur ne sait pas que cela se passe, il n'est pas aussi préalable, mais préfixe et postfix l'identifiant réel avec 2 ou 3 numéros / lettres aléatoires. P>
Si j'ai vu 9D2A1ME3, je ne devinerais pas que DM2A2DQ2 était la suivante de la série. P>
Essayez Xor'ing le $ ID avec une certaine valeur, par exemple. $ ID ^ 46418 CODE> - et à reconvertir à votre identifiant d'origine, vous venez de réaliser à nouveau le même Xor I.e.
$ munged ^ 46418 code>. Empilez ceci avec votre base_convert et peut-être un échange de caractères résultant et cela deviendra assez délicat de deviner une URL. P>
Pour un pirate informatique légèrement déterminé - pour Joe public, pas tellement.
Ce que vous demandez est un équilibre entre la réduction des informations (URL à leurs index de votre base de données) et une augmentation artificielle des informations (pour créer des trous dans votre séquence). p>
Vous devez décider à quel point les deux sont importants pour vous. Une autre question est de savoir si vous ne voulez tout simplement pas que des URL séquentielles soient préalables ou que vous les avez suffisamment aléatoires pour faire de la supposition tout em> URL valide difficile. p>
Fondamentalement, vous voulez déclarer n des NDS valides. Choisissez N plus petit pour rendre les URL plus courtes et faire n plus petit pour générer des URL difficiles à deviner. Faire n et n plus grand pour générer plus d'URL lorsque les plus courtes sont prises. P>
Pour attribuer les identifiants, vous pouvez simplement prendre tout type de générateur aléatoire ou de fonction de hachage et de permettre à votre plage cible N. Si vous détectez une collision, choisissez la prochaine valeur aléatoire. Si vous avez atteint un nombre d'identifiants uniques, vous devez augmenter la plage de votre jeu d'identité (N et N). p>
Concernant votre dernier paragraphe. Je pense qu'il veut une valeur qu'il peut inverser, c'est-à-dire qu'il veut une fonction injective.
Non, il veut vraiment une fonction sans surveillable. ;) Comme il doit de toute façon stocker les URL dans une base de données, il peut utiliser le nombre aléatoire comme index. Renversement atteint.
Vrai, ne doit pas nécessairement être injectif.
Vous pouvez pré-définir les codes de 4 caractères à l'avance (toutes les combinaisons possibles), puis randomiser cette liste et le stocker dans cet ordre aléatoire dans une table de données. Lorsque vous souhaitez une nouvelle valeur, saisissez simplement le premier hors top et retirez-le de la liste. C'est rapide, pas de calcul sur la mouche et garantit une pseudo-aléatoire à l'utilisateur final. P>
Je dois souligner que c'est exactement ce que j'ai fait pour un raccourpateur d'URL, et c'est un peu douloureux de commencer. Il existe énormément de combinaisons possibles, ce qui signifie que vous commencez avec un énorme fichier de base de données pour un concept aussi simple.
@Relet, qu'est-ce que vous parlez exactement? Le fait qu'il y ait un nombre limité qui ne peut augmenter? Si tel est le cas, une fois que vous avez commencé à court de codes de 4 caractères, calculez tous les codes de 5 caractères et insérez-le dans votre table de file d'attente.
Si vous souhaitez une fonction injective, vous pouvez utiliser n'importe quelle forme de cryptage. Par exemple: inverser: p> Cela ne vous donnera pas de numéro dans la base 32; Il vous donnera les données cryptées avec chaque octet converti en base 16 (c'est-à-dire la conversion est globale). Si vous avez vraiment besoin, vous pouvez convertir trivialement cela en la base 10 puis sur la base 32 avec n'importe quelle bibliothèque qui prend en charge les gros entiers. P> P>
N'oubliez pas que l'URL résultante doit être courte (1399E6A37A6E9870 est trop longue).
@Tom Eh bien, il pourrait le convertir en Base 64 environ et obtenir (je pense) 11 caractères. Ou utiliser
Une autre manière serait de définir le nombre maximum de caractères de l'URL (disons que c'est Sur quelle nouvelle URL, vous incrempériez l'ID et utilisez le numéro de permutation pour associer l'ID réel qui serait utilisé. Enfin, vous allez baser 32 (ou autre) encoder votre URL. Ceci serait parfaitement aléatoire et parfaitement réversible. P> n code>). Vous pouvez ensuite choisir un nombre aléatoire entre 1 et N!, Qui serait votre numéro de permutation. P>
Les ID dupliqués sont possibles de cette manière, de cette manière, vous devez donc vérifier à nouveau cela et incrémenter si dupliquer.
J'ai fini par créer une somme MD5 de l'identifiant, utilisez les 4 premiers alphanumériques de celui-ci et s'il s'agit d'un duplicata, il suffit d'incrémenter la longueur jusqu'à ce qu'il ne soit plus un duplicata.
function idToTinyurl($id) { $md5 = md5($id); for ($i = 4; $i < strlen($md5); $i++) { $possibleTinyurl = substr($md5, 0, $i); $res = mysql_query("SELECT id FROM tabke WHERE tinyurl='".$possibleTinyurl."' LIMIT 1"); if (mysql_num_rows($res) == 0) return $possibleTinyurl; } return $md5; }
HASHIDS est une bibliothèque open-source qui génère Il convertit des nombres comme 347 en cordes telles que "YR8", ou une matrice comme [27, 986] dans "3ktmd". Vous pouvez également décoder ces identifiants de retour. Ceci est utile pour regrouper plusieurs paramètres en un ou simplement les utiliser comme des uides courtes. P> Utilisez-le quand Vous ne voulez pas strong> à exposer forte> Votre base de données IDS strong> à l'utilisateur. P> Il permet une alphabet personnalisée ainsi que du sel, les identifiants sont donc uniques que pour vous. p> L'entrée incrémentielle est gérée pour rester inégalable. P> Il n'y a pas de collision car la méthode est basée sur une conversion entier à heex. P> Il a été écrit avec l'intention de placer des identifiants créés dans des endroits visibles, comme l'URL. Par conséquent, l'algorithme évite de générer des mots de malédiction anglais les plus courants. P> exemple de code p>