Fonction de hachage en python

Fonction de hachage en python - Python - Programmation

Marsh Posté le 19-11-2014 à 16:48:26    

Bonjour,
J'aurai besoin d'aide , voici  l’énoncé  de mon problème :  
je dois écrire une fonction de hachage (f) en python qui transforme un ensemble des entiers en un seul numéro et bien sur je dois écrire la fonction réciproque (f') qui a partir d'un numéro donné peut exporter l'ensemble des entiers.
par exemple :
f(2,31,145,5,96) = 2015600122
f'(2015600122) =  2,31,145,5,96
J'ai aucune idée sur la solution  
merci de m'aider car c'est très urgent

Reply

Marsh Posté le 19-11-2014 à 16:48:26   

Reply

Marsh Posté le 20-11-2014 à 09:17:56    

Bonjour, voici ce dont tu as besoin :
 
http://szudzik.com/ElegantPairing.pdf


---------------
rule #1 : trust the python
Reply

Marsh Posté le 20-11-2014 à 09:19:12    

user1304 a écrit :

Bonjour,
J'aurai besoin d'aide , voici  l’énoncé  de mon problème :  
je dois écrire une fonction de hachage (f) en python qui transforme un ensemble des entiers en un seul numéro et bien sur je dois écrire la fonction réciproque (f') qui a partir d'un numéro donné peut exporter l'ensemble des entiers.
par exemple :
f(2,31,145,5,96) = 2015600122
f'(2015600122) =  2,31,145,5,96
J'ai aucune idée sur la solution  
merci de m'aider car c'est très urgent


 
Ben une fonction de hachage n'a pas pour but d'être inversible parce qu'elle n'est pas injective. C'est à dire que tu pourras très bien avoir deux ensembles de données qui donneront le même hachage. Lors de la transformation de hachage on perd de l'information, alors il n'est pas possible de revenir en arrière. Je suggérerais plutôt de trouver une fonction de compression si tu veux pouvoir revenir en arrière. Mais là il faudrait peut-être connaître plus en détail ce que tu penses donner comme paramètres à la fonction f (par exemple 5 nombres compris entre 0 et 145, ou un nombre quelconque d'entiers définits sur 32 bits, ou n'importe quoi d'autre).

Reply

Marsh Posté le 20-11-2014 à 09:50:34    

leonhard a écrit :


 
Ben une fonction de hachage n'a pas pour but d'être inversible parce qu'elle n'est pas injective. C'est à dire que tu pourras très bien avoir deux ensembles de données qui donneront le même hachage. Lors de la transformation de hachage on perd de l'information, alors il n'est pas possible de revenir en arrière. Je suggérerais plutôt de trouver une fonction de compression si tu veux pouvoir revenir en arrière. Mais là il faudrait peut-être connaître plus en détail ce que tu penses donner comme paramètres à la fonction f (par exemple 5 nombres compris entre 0 et 145, ou un nombre quelconque d'entiers définits sur 32 bits, ou n'importe quoi d'autre).


 
 
 
Merci de ta réponse.
En fait, la fonction f prends comme paramètres un nombre quelconque d'entiers compries entre 1 et 800 000 000 . Est ce que tu peux m'aider la fonction de compression en python qui fait ca car j'ai aucune idée dans ce domaine.

Reply

Marsh Posté le 20-11-2014 à 14:04:59    

Facile si tu as juste besoin d'une fonction injective et aucune limitation sur la taille du nombre résultat: pour une suite d'entiers (n1, n2, ..., nk) tu fais correspondre l'entier produit p1^n1 * p2^n2 * ... * pk^nk ou p1, p2, ..., pk sont les k premiers nombres premiers.
Bon évidemment, c'est tout sauf un hachage efficace, puisque le résultat risque de prendre plus de place que les données à hacher...
A+,

Message cité 1 fois
Message édité par gilou le 20-11-2014 à 14:11:05

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 20-11-2014 à 14:29:30    

gilou a écrit :

Facile si tu as juste besoin d'une fonction injective et aucune limitation sur la taille du nombre résultat: pour une suite d'entiers (n1, n2, ..., nk) tu fais correspondre l'entier produit p1^n1 * p2^n2 * ... * pk^nk ou p1, p2, ..., pk sont les k premiers nombres premiers.
Bon évidemment, c'est tout sauf un hachage efficace, puisque le résultat risque de prendre plus de place que les données à hacher...
A+,


 
Merci de ta réponse  
 
je viens d'utiliser ta méthode mais le problème reste dans la fonction qui fait l'inverse autrement dit la fonction qui prend comme paramètres (p1^n1 * p2^n2 * ... * pk^nk) et donne (n1, n2, ..., nk) comme résultats.
 
Est ce que tu peux m'aider

Reply

Marsh Posté le 20-11-2014 à 15:23:23    

Mais tes fonctions ce sont des fonctions que tu dois coder dans un soucis d'apprentissage (et de recherche d'algo) ou ça a une réel utilité dans un script/programme plus conséquent ?
 
Car dans le 2eme cas c'est pas plutôt une serialisation que tu cherches a faire ?
https://docs.python.org/2/library/pickle.html

Reply

Marsh Posté le 20-11-2014 à 15:29:02    

Exemple

Code :
  1. >>> import pickle
  2. >>> value = pickle.dumps([2,31,145,5,96])
  3. >>> value
  4. '(lp0\nI2\naI31\naI145\naI5\naI96\na.'
  5. >>> print pickle.loads(value)
  6. [2, 31, 145, 5, 96]

Reply

Marsh Posté le 20-11-2014 à 17:12:53    

user1304 a écrit :


 
Merci de ta réponse  
 
je viens d'utiliser ta méthode mais le problème reste dans la fonction qui fait l'inverse autrement dit la fonction qui prend comme paramètres (p1^n1 * p2^n2 * ... * pk^nk) et donne (n1, n2, ..., nk) comme résultats.
 
Est ce que tu peux m'aider


l'algo devrait ressembler a qque chose comme ceci:
Ton nombre initial est N
liste (vide au départ)
Si N = 0  
    pousser 0 sur la liste
sinon
    prime = 2
    tant que N != 1
        si N modulo prime != 0  
            sortir en erreur, l'entrée n'est pas dans l'image injective des suites d'entiers par la fonction de hash
        sinon nombre = 0
            tant que N modulo prime == 0
                 N = N divisé par p
                 incrémenter nombre
        pousser nombre dans la liste
        prime = nombre premier suivant
renvoyer liste
 
Edit, en y réfléchissant, le cas de 0 dans la liste pose problème, et a priori, s"il y en a, il vaut mieux prendre (p1^(n1+1) * p2^(n2+1) * ... * pk^(nk+1)) comme hash. Mais comme je te l'ai déja dit, c'est une fonction complétement inefficace a priori.
A+,


Message édité par gilou le 20-11-2014 à 17:20:33

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed