Fonction de hachage en python - Python - Programmation
Marsh Posté le 20-11-2014 à 09:17:56
Bonjour, voici ce dont tu as besoin :
http://szudzik.com/ElegantPairing.pdf
Marsh Posté le 20-11-2014 à 09:19:12
user1304 a écrit : Bonjour, |
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).
Marsh Posté le 20-11-2014 à 09:50:34
leonhard a écrit : |
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.
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+,
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. |
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
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
Marsh Posté le 20-11-2014 à 15:29:02
Exemple
Code :
|
Marsh Posté le 20-11-2014 à 17:12:53
user1304 a écrit : |
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+,
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