2010-06-28 4 views
0

J'utilise la fonction md5 pour hacher une chaîne dans une chaîne de 32 chiffres.Fonction de compression python qui renvoie une chaîne de 32 chiffres?

str_to_encode = 'this is a test string which I want to encode' 
encoded = hashlib.md5(str_to_encode).hexdigest() 

Je veux être en mesure de décoder cette chaîne (à savoir encoded dans l'exemple ci-dessus) à sa valeur d'origine. Je ne pense pas que ce soit possible en utilisant md5 (mais si c'est le cas s'il vous plaît faites le moi savoir), mais y at-il une fonction de compression que je peux utiliser qui me donnera une chaîne de 32 chiffres à la fin?

EDIT: La chaîne en cours de codage est une URL, elle ne sera donc que de quelques centaines de caractères maximum, bien que dans la plupart des cas ce soit beaucoup moins.

Merci

+2

Que se passe-t-il? C'est comme la quatrième personne qui a demandé "décodage md5" dans le dernier jour ou alors –

+0

Ha, je ne suis pas d'un intérêt à le décoder car je suis assez certain que cela ne peut pas être fait. Ce qui m'intéresse vraiment, c'est une fonction qui encodera une chaîne en une chaîne de 32 longueurs qui pourra ensuite être convertie/décodée dans son format d'origine. A l'origine je n'avais pas besoin de le décoder et j'avais juste besoin qu'il soit de 32 longueurs et c'est pourquoi j'ai utilisé md5 mais j'ai maintenant besoin de le décoder aussi. – John

+2

MD5 est une fonction de hachage. Il ne peut pas être utilisé pour compresser et décompresser une chaîne. – liviucmg

Répondre

4

Il me semble que vous n'êtes pas à la recherche d'un hachage ou d'un cryptage, vous recherchez une compression. Essayez zlib et l'encodage base64:

s = 'Hello, world' 
encoded = zlib.compress(s).encode('base64') 

La longueur des données codées augmentera à mesure que l'entrée se développe, mais il peut travailler pour vous.

Même en vous limitant aux URL, il n'y a aucun moyen de les mapper de manière réversible aux chaînes de 32 caractères, il y a juste trop d'URL possibles.

4

Vous semblez vouloir deux choses qui ne peuvent pas coexister:

  • Toute chaîne de longueur quelconque est converti en exactement 32 octets, même si elle a commencé comme 4gb
  • Le chaîne codée est décodable sans perte d'information

il n'y a que tant de bits dans un hachage MD5, donc par le pigeonhole principle il est impossible d'inverser il. S'il était réversible, vous pourriez utiliser un hachage pour compresser l'information à l'infini. En outre, l'irréversibilité est le point principal d'un hachage; ils sont destinés à être des fonctions à sens unique. Les algorithmes de chiffrement sont réversibles, mais nécessitent plus d'octets pour stocker le texte chiffré puisque la décodabilité signifie qu'ils doivent être sans collision (deux textes en clair ne peuvent pas encoder dans le même texte chiffré, ou la fonction de décodage ne sait pas quel texte doit être édité).

+0

La piqûre est une url donc ne sera jamais si longtemps. Je ne sais pas quelle est la longueur maximum d'une URL mais je ne vois pas qu'elle soit supérieure à quelques centaines de caractères si cela peut vous aider. – John

+0

Même ainsi, vous n'allez pas contenir quelques centaines de caractères dans une chaîne de 32 octets. Une chaîne UTF-32 de 32 caractères, peut-être. –

+0

@John Techniquement il n'y a pas de limite (http://stackoverflow.com/questions/417142/what-is-the-maximum-length-of-an-url), mais les URLs incroyablement longues sont rares. On dirait que vous cherchez un algorithme de compression, plutôt que le cryptage ou le hachage - la sécurité est-elle une préoccupation? Je doute qu'il y ait des algorithmes de compression qui soient assez efficaces, mais je n'ai pas vraiment essayé la sécurité –

Questions connexes