8
votes

Comment générer une "URL minuscule" sans surveillance basée sur un identifiant?

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)


0 commentaires

9 Réponses :


5
votes

Je voudrais simplement CRC32 URL

$url = 'http://www.google.com';
$tinyurl = hash('crc32', $url ); // db85f073


1 commentaires

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é.



4
votes

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.

Si j'ai vu 9D2A1ME3, je ne devinerais pas que DM2A2DQ2 était la suivante de la série.


0 commentaires

3
votes

Essayez Xor'ing le $ ID avec une certaine valeur, par exemple. $ ID ^ 46418 - et à reconvertir à votre identifiant d'origine, vous venez de réaliser à nouveau le même Xor I.e. $ munged ^ 46418 . 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.


1 commentaires

Pour un pirate informatique légèrement déterminé - pour Joe public, pas tellement.



9
votes

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).

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 URL valide difficile.

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.

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).


3 commentaires

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.



0
votes

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.


2 commentaires

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.



1
votes

Si vous souhaitez une fonction injective, vous pouvez utiliser n'importe quelle forme de cryptage. Par exemple: xxx

inverser: xxx

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.


2 commentaires

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



2
votes

Une autre manière serait de définir le nombre maximum de caractères de l'URL (disons que c'est n ). Vous pouvez ensuite choisir un nombre aléatoire entre 1 et N!, Qui serait votre numéro de permutation.

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.


1 commentaires

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.



-1
votes

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;
}


0 commentaires

0
votes

HASHIDS est une bibliothèque open-source qui génère courte, unique, non séquentielle, de type YouTube IDS d'un ou plusieurs chiffres. Vous pouvez y penser comme un algorithme d'obscurcissement des nombres .

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.

Utilisez-le quand Vous ne voulez pas à exposer Votre base de données IDS à l'utilisateur.

Il permet une alphabet personnalisée ainsi que du sel, les identifiants sont donc uniques que pour vous.

L'entrée incrémentielle est gérée pour rester inégalable.

Il n'y a pas de collision car la méthode est basée sur une conversion entier à heex.

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.

exemple de code xxx


0 commentaires