Je veux créer un service de raccourcissement d'URL où vous pouvez écrire une longue URL dans un champ de saisie et le service raccourcit l'URL en " http://www.example.org/abcdef
".
Au lieu de " abcdef
"il peut y avoir n'importe quelle autre chaîne de six caractères contenant a-z, A-Z and 0-9
. Cela fait 56~57 milliards de chaînes possibles.
Mon approche :
J'ai une table de base de données avec trois colonnes :
- id, entier, auto-incrémenté
- long, string, l'URL longue que l'utilisateur a saisie
- short, string, l'URL raccourcie (ou juste les six caractères)
J'insérerais ensuite l'URL longue dans le tableau. Je sélectionnerais ensuite la valeur d'auto-incrémentation pour " id
"et construire un hachage de celui-ci. Ce hachage doit ensuite être inséré comme " short
". Mais quel type de hachage dois-je construire ? Les algorithmes de hachage comme MD5 créent des chaînes trop longues. Je n'utilise pas ces algorithmes. Un algorithme construit par moi-même fonctionnera aussi.
Mon idée :
Pour " http://www.google.de/
" J'obtiens l'identifiant auto-incrémenté 239472
. Ensuite, je procède aux étapes suivantes :
short = '';
if divisible by 2, add "a"+the result to short
if divisible by 3, add "b"+the result to short
... until I have divisors for a-z and A-Z.
Cela pourrait être répété jusqu'à ce que le nombre ne soit plus divisible. Pensez-vous que c'est une bonne approche ? Avez-vous une meilleure idée ?
<em>En raison de l'intérêt constant pour ce sujet, j'ai <a href="https://github.com/delight-im/ShortURL" rel="noreferrer">a publié une solution efficace pour GitHub </a>avec des mises en œuvre pour <a href="https://github.com/delight-im/ShortURL/blob/master/JavaScript/ShortURL.js" rel="noreferrer">JavaScript </a>, <a href="https://github.com/delight-im/ShortURL/blob/master/PHP/ShortURL.php" rel="noreferrer">PHP </a>, <a href="https://github.com/delight-im/ShortURL/blob/master/Python/shorturl.py" rel="noreferrer">Python </a>et <a href="https://github.com/delight-im/ShortURL/blob/master/Java/ShortURL.java" rel="noreferrer">Java </a>. Ajoutez vos solutions si vous le souhaitez :)</em>
5 votes
@gudge L'intérêt de ces fonctions est qu'elles ont une fonction inverse. Cela signifie que vous pouvez avoir à la fois
encode()
etdecode()
fonctions. Les étapes sont donc les suivantes (1) Enregistrer l'URL dans la base de données (2) Obtenir un ID de ligne unique pour cette URL à partir de la base de données (3) Convertir l'ID entier en chaîne courte avecencode()
par exemple273984
àf5a4
(4) Utilisez la chaîne courte (par ex.f4a4
) dans vos URLs partageables (5) Lorsque vous recevez une demande pour une chaîne courte (par ex.20a8
), décoder la chaîne en un ID entier avecdecode()
(6) Recherchez l'URL dans la base de données pour un ID donné. Pour la conversion, utilisez : github.com/delight-im/ShortURL0 votes
@Marco, quel est l'intérêt de stocker le hash dans la base de données ?
3 votes
@MaksimVi. Si vous avez une fonction inversible, il n'y en a pas. Si vous aviez une fonction de hachage à sens unique, il y en aurait une.
2 votes
Serait-ce mal d'utiliser le simple algorithme CRC32 pour raccourcir une URL ? Bien que la collision soit très improbable (une sortie CRC32 comporte généralement 8 caractères, ce qui nous donne plus de 30 millions de possibilités), si une sortie CRC32 générée a déjà été utilisée précédemment et se trouve dans la base de données, nous pourrions saler la longue URL avec un nombre aléatoire jusqu'à ce que nous trouvions une sortie CRC32 unique dans ma base de données. Dans quelle mesure cela serait-il mauvais, différent ou laid pour une solution simple ?
0 votes
Approche typique de la conversion d'un nombre en chaîne courte en Java