10
votes

Convertir MD5 en Base62 pour URL

J'ai un script à convertir en Base 62 (A-ZA-Z0-9) mais comment puis-je obtenir un numéro de MD5?

J'ai lu dans de nombreux endroits que, car le nombre d'un MD5 est plus grand que PHP peut gérer comme un entier, il sera inexact ... car je veux une courte url de toute façon et que je ne prévoyais pas d'utiliser tout le hachage, peut-être que Il suffit de 8 caractères ....

Donc, ma question est de savoir comment faire partie du nombre d'un hachage de MD5?

C'est aussi une mauvaise idée d'utiliser uniquement une partie du hachage MD5?


14 commentaires

MD5 HASH n'est pas un nombre, alors qu'entendez-vous par «une partie du nombre»?


MD5 est un nombre représenté dans la base36 codant, je pensais ...


Vous avez une moitié à droite, un hachage de MD5 est un numéro hexagonible représenté dans la base 16 (A-F0-9).


Non, MD5 () est par défaut converti en Base 16 (HEX), mais vous pouvez également obtenir la sortie brute.


Un hachage MD5 est un nombre 128 bits. La représentation habituelle est en hexagone, mais ce n'est pas nécessaire.


OK, alors comment puis-je convertir l'hex en nombre? Je sais que le nombre est trop gros pour PHP pour gérer afin que je devrais utiliser substrateur et hexdec?


Je suis au courant de cela, mais je ne crois pas qu'il parle de la représentation crue du hachage ici.


@Mark: Substr et HexDec ne fonctionneront pas car vous ne pouvez pas calculer le nombre entier tout en la rompant dans plusieurs pièces avec substruisement.


L'utilisation de base64 rendra beaucoup plus facile, car elle code les blocs de 3 octets consécutifs.


@ N0RD: base64 n'est pas entièrement compatible avec les URL.


@eyze - mais si je veux seulement faire partie du hachage de toute façon, quels sont les préjudice dans une partie de la substrité, puis hexdec il et ensuite base62 le convertir?


@Mark: Je suis confus, vous souhaitez faire partie du hachage MD5 (base 16), le convertir en base 10, puis la convertir à nouveau en Base 62?


Oui ... est-il possible de convertir directement de 16 à 62?


@Mark: Oui, mais en fonction de la taille du nombre, il peut ne pas suffire à stocker sur un type de variable flottant, je modifierai ma réponse sous peu.


9 Réponses :


8
votes

Je vais suggérer une autre chose ici .. Depuis que vous êtes seulement intéressé à utiliser une partie décimale du hachage MD5 Pourquoi n'utilisez-vous pas d'autres hachages numériques courts comme CRC32 ou adler ? Voici un exemple:

echo bc_base_convert('base 62 encoded value here', 62, 16); // private md5 hash


2 commentaires

Est-il possible de déterminer ce qui est allé dans le hachage? Juste je pense que si je montrais seulement une partie d'un hachage, il doit rendre plus difficile l'entraînement de la façon dont il a été généré ... non?


À droite, mais ce ne serait pas un hachage dans le vrai sens du terme, ainsi que des collisions sont beaucoup plus probables de se produire.



1
votes

Vous pouvez faire cela comme ceci: (toutes les étapes ne sont pas dans PHP, cela fait longtemps que je l'ai utilisé.)


0 commentaires

-1
votes

Vous pouvez utiliser une base légèrement modifiée 64 avec - et _ au lieu de + et / : < Pré> XXX

De plus, vous pouvez supprimer le remplissage de fuite = caractères.

et pour obtenir la valeur MD5 brute (chaîne binaire), définissez le deuxième paramètre (nommé $ brut_output dans le manuel) pour vrai : xxx


1 commentaires
0
votes

Vous pouvez faire quelque chose comme ça, xxx


0 commentaires

1
votes

Il y a en fait une implémentation Java que vous pourriez probablement extraire. C'est une solution CMS open-source appelée Pulse.

Regardez ici pour le code de Tobase62 () et frombase62 () .

http: // pouls .torweg.org / javadoc / src-html / org / torweg / pouls / util / stringutils.java.html

La seule dépendance dans stringutils est la classe de cygne qui permet de créer un hasch salé pour une chaîne que vous pourriez même omettre tous ensemble ou de copier simplement la méthode sur votre copie Stringutils . Voilá.


0 commentaires

0
votes

à partir de PHP 5.3.2, GMP prend en charge les bases jusqu'à 62 (était auparavant seulement 36), la suggestion de Brianrevevis était donc très proche. Je pense que la réponse la plus simple à votre question est donc la suivante:

function base62hash($source, $chars = 22) {
  return substr(gmp_strval(gmp_init(md5($source), 16), 62), 0, $chars);
}


0 commentaires

0
votes

Vous pouvez essayer BASE62X pour obtenir une représentation codée codée sûre et compatible.

Voici pour plus d'informations sur la base62x , ou simplement -base62x dans -naturéns . xxx


0 commentaires

0
votes

Voici une bibliothèque Java open source qui convertit les chaînes MD5 aux chaînes de base62 https://github.com/inder123/base62

md5tobase62.tobase62 ("9e107d9d372bb6826bd81d3542a419d6") ==> cbikgimvklfteenaa5kgo4

md5tobase62.frombase62 ("4kfzya1udigcjcefc0l") ==> 0000bdd3bb56865852a632deadbc62fc

La conversion est à deux voies. Vous obtiendrez ainsi l'original MD5 de retour si vous le convertissez à MD5:

md5tobase62.frombase62 (MD5TOBASE62.TOBASE62 ("9E107D9D372BB6826BD81D6")) ==> 9E107D9D372BB6826BD81D6

md5tobase62.tobase62 (md5tobase62.frombase62 ("cbikgimvklfteenaa5kgo4"))). ==> cbikgimvklfteenaa5kgo4

`` `


0 commentaires