Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Aide | Shop Recherche
587 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  Fonction de hachage en python

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction de hachage en python

n°2243477
user1304
Posté le 19-11-2014 à 16:48:26  profilanswer
 

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

mood
Publicité
Posté le 19-11-2014 à 16:48:26  profilanswer
 

n°2243528
suizokukan
Posté le 20-11-2014 à 09:17:56  profilanswer
 

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


---------------
rule #1 : trust the python
n°2243529
leonhard
Posté le 20-11-2014 à 09:19:12  profilanswer
 

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).

n°2243535
user1304
Posté le 20-11-2014 à 09:50:34  profilanswer
 

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.

n°2243550
gilou
Modérateur
Modzilla
Posté le 20-11-2014 à 14:04:59  profilanswer
 

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!    --    In umbra igitur pugnabimus. --
n°2243552
user1304
Posté le 20-11-2014 à 14:29:30  profilanswer
 

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

n°2243556
rage2000
Posté le 20-11-2014 à 15:23:23  profilanswer
 

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

n°2243557
rage2000
Posté le 20-11-2014 à 15:29:02  profilanswer
 

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]

n°2243566
gilou
Modérateur
Modzilla
Posté le 20-11-2014 à 17:12:53  profilanswer
 

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!    --    In umbra igitur pugnabimus. --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  Fonction de hachage en python

 

Sujets relatifs
Script python Raspberry à adapter et corrigerDamier sur python
table hachage petit problème c++programmation en python, petit blocage
Python programme aide[Excel VBA]Fonction Rank ignorer cellule vide et passer à la suivante
Programme faux en pythonEnvois d'un double tableau à une fonction
Aide sur une fonction retournat un pointeur sur char. MerciUtiliser getClass() dans une fonction
Plus de sujets relatifs à : Fonction de hachage en python


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite) / Groupe LDLC / Shop HFR