Convertir MD5 pour base62 URL
J'ai un script pour convertir la base de 62 (A-Za-z0-9), mais comment puis-je obtenir un certain nombre de MD5?
J'ai lu dans de nombreux endroits, que parce que le numéro à partir d'un MD5 est plus grand que php peut gérer un nombre entier, il sera infidèle... Que je veux un lien court de toute façon et n'a pas de planification sur l'utilisation de l'ensemble de hachage, peut-être, à seulement 8 caractères....
Donc ma question est comment faire pour récupérer une partie de la nombre de un hachage MD5?
C'est aussi une mauvaise idée d'utiliser une partie seulement de le hash MD5?
- md5 hash n'est pas un nombre, de sorte qu'entendez-vous par "partie du numéro"?
- md5 est un nombre représenté en base36 encodage j'ai pensé...
- Vous êtes à demi-droite, un hachage md5 est un nombre hexadécimal représenté en base 16 (a-f0-9).
- Non, md5() est par défaut converti en base 16 (hexadécimal), mais vous pouvez obtenir la sortie brute de même.
- Un hachage md5 est un 128bit nombre. La représentation habituelle est dans l'hexagone, mais ce n'est pas nécessaire.
- ok, alors comment puis-je convertir l'hexagone pour un certain nombre? Je sais que le nombre est trop grand pour php pour gérer dois-je donc utiliser substr et hexdec?
- Je suis conscient de cela, mais je ne crois pas qu'il parle de la crue de la représentation de la table de hachage ici.
- substr et hexdec ne fonctionne pas puisque vous ne pouvez pas calculer le nombre entier tout en le brisant en plusieurs parties avec substr.
- En utilisant Base64 va rendre les choses beaucoup plus facile, car il encode consécutifs 3 octets blocs.
- base64 n'est pas entièrement compatible avec les Url.
- mais si je veux seulement une partie de la valeur de hachage de toute façon, alors quel est le mal à juste substr partie et ensuite hexdec et puis base62 convertir?
- Je suis confus, vous voulez prendre une partie de l'md5 (base 16) de hachage, de le convertir en base 10 et ensuite de les convertir à nouveau à la base de 62?
- oui... est-il possible de convertir directement de 16 à 62?
- Oui, mais en fonction de la taille de la nombre pourrait ne pas être suffisant pour la stocker dans une variable de type float type, je vais modifier ma réponse sous peu.
Vous devez vous connecter pour publier un commentaire.
Je vais proposer une autre chose ici.. Depuis que vous vous intéressez seulement à l'aide d'une virgule morceau de hachage md5 pourquoi ne pas utiliser toute autre numérique courte de hachage comme CRC32 ou Adler? Voici un exemple:
Cela va produire des 8 chiffres du hash de votre chaîne.
EDIT: je pense que j'ai mal compris, voici quelques fonctions qui fournissent des conversions vers et à partir de bases jusqu'à 62.
MODIFIER (Encore une fois): travailler avec une longueur arbitraire numéros, vous devez utiliser la bc_math ou le GMP extension, voici une fonction qui utilise la bc_math extension et peut également convertir à partir de la base 2 à la base de 62. Vous devriez l'utiliser comme ceci:
et à l'inverse:
Espère que cela aide. =)
Si c'est possible, je vous conseille de ne pas utiliser une table de hachage pour votre Url. Finalement, vous allez courir dans les collisions... surtout si vous êtes en tronquant le hachage. Si vous allez de l'avant et de mettre en œuvre un id système où chaque élément possède un IDENTIFIANT unique, il y aura beaucoup moins de maux de tête. Le premier élément sera
1
, la deuxième serez2
, etc---si vous utilisez MySQL, il suffit de jeter dans une colonne autoincrement.De faire un court-id:
De faire une petite id de nouveau dans la base 10 id:
Espérons que cette aide!
Si vous êtes vraiment désireux de base 62 (qui ne peut être fait avec
gmp
oubase_convert
), check this out:http://snipplr.com/view/22246/base62-encode--decode/
Vous pouvez le faire comme ceci: (Pas toutes les étapes sont en php, cela fait un bout de temps que je l'ai utilisé.)
Créer un hachage md5 du script comme ceci:
$hash = md5(script, raw_output=true);
De convertir ce nombre de la base de 62.
Voir les questions sur l' la base de la conversion de l'arbitraire de la taille des nombres en PHP
Tronquer la chaîne à la longueur que vous souhaitez.
Il n'y a pas de risque à l'aide de seulement quelques-uns des morceaux d'un md5. Tout ce qui change est le danger de collision.
Il y a en fait une implémentation de Java qui vous pourriez probablement extrait. C'est un open-source CMS solution Pulse.
Regardez ici pour le code de
toBase62()
etfromBase62()
.http://pulse.torweg.org/javadoc/src-html/org/torweg/pulse/util/StringUtils.java.html
La seule dépendance dans
StringUtils
est le Cycle de vie de la classe, ce qui permet d'obtenir un salée de hachage pour une chaîne qui vous pourriez même omettre tous ensemble, ou tout simplement copier la méthode sur votre copieStringUtils
. Voilá.Vous pourriez utiliser un peu modifié en Base 64 avec
-
et_
au lieu de+
et/
:En outre, vous pouvez supprimer le remplissage à droite
=
caractères.Et pour obtenir le raw valeur MD5 (chaîne binaire), définissez le second paramètre (nommé
$raw_output
dans le manuel) pour vrai:Vous pouvez faire quelque chose comme cela,
Comme PHP 5.3.2, GMP prend en charge les bases de jusqu'à 62 ans (auparavant, seuls 36), de sorte brianreavis la suggestion était très proche. Je pense que la réponse la plus simple à votre question est donc:
De la conversion à partir de la base-16 de la base-62 a évidemment l'avantage d'espace. Normal 128 bits de hachage MD5 est de 32 caractères en hexadécimal, mais dans la base-62 c'est seulement 22. Si vous stockez les mots de passe hachés dans une base de données, vous pouvez les convertir en binaire brut et économiser encore plus d'espace (16 octets pour un MD5).
Puisque la valeur de hachage est juste une représentation de chaîne, vous pouvez simplement utiliser substr si vous voulez seulement un peu d'elle (comme la fonction t).
Vous pouvez essayer base62x pour obtenir un coffre-fort et compatible codé représentation.
Ici pour plus d'informations sur base62x, ou tout simplement
-base62x
dans-NatureDNS
.Ici est un open-source Java bibliothèque qui convertit MD5 chaînes de chaînes Base62
https://github.com/inder123/base62
Md5ToBase62.toBase62("9e107d9d372bb6826bd81d3542a419d6") ==> cbIKGiMVkLFTeenAa5kgO4
Md5ToBase62.fromBase62("4KfZYA1udiGCjCEFC0l") ==> 0000bdd3bb56865852a632deadbc62fc
La conversion dans les deux sens, de sorte que vous aurez l'original md5 arrière si vous reconvertir md5:
Md5ToBase62.fromBase62(Md5ToBase62.toBase62("9e107d9d372bb6826bd81d3542a419d6")) ==> 9e107d9d372bb6826bd81d3542a419d6
Md5ToBase62.toBase62(Md5ToBase62.fromBase62("cbIKGiMVkLFTeenAa5kgO4")) . ==> cbIKGiMVkLFTeenAa5kgO4
``