2012-11-24 3 views
1

J'ai une liste d'identifiants que je veux ajouter avec la chaîne 'texte'. Je veux vérifier si l'un des ids (après avoir été ajouté avec la chaîne 'text') est égal à la chaîne 'text_compare'.SHA512 Python a produit un résultat différent pour la même chaîne

Ce qui est étrange, c'est que la chaîne avant que le hachage ait lieu est égale, mais après le hachage a lieu, le hachage ne semble pas avoir produit les mêmes résultats. Voici mon code. Vous pouvez le tester sur la ligne de commande Python.

import hashlib 
h = hashlib.sha512() 

text = 'beruk makye' 
text_compare = '3beruk makye' 
text_compare_hash = h.update(text_compare) 
text_compare_hash = h.hexdigest() 

ids = [1,2,3] 
texts = [] 
bool_text = [] 
bool_text_hash = [] 

for id in ids: 
    texts.append(str(id) + text) 

for t in texts: 
    if t == text_compare: 
     bool_text.append(True) 
    else: 
     bool_text.append(False) 

for t in texts: 
    h.update(t) 
    t_hash = str(h.hexdigest()) 
    if t_hash == text_compare_hash: 
     bool_text_hash.append(True) 
    else: 
     bool_text_hash.append(False) 

print ids 
# [1, 2, 3] 
print texts 
# ['1beruk makye', '2beruk makye', '3beruk makye'] 
print bool_text 
# [False, False, True] 
print bool_text_hash 
# [False, False, False] 

Répondre

5

Votre problème est que vous réutilisez le même objet de hachage, donc vous continuez à l'ajouter. Chaque fois que vous devez instancier un nouvel objet sha512(). Le code ci-dessous fonctionne correctement.

import hashlib 
h = hashlib.sha512() 

text = 'beruk makye' 
text_compare = '3beruk makye' 
text_compare_hash = h.update(text_compare) 
text_compare_hash = h.hexdigest() 

ids = [1,2,3] 
texts = [] 
bool_text = [] 
bool_text_hash = [] 

for id in ids: 
    texts.append(str(id) + text) 

for i in texts: 
    hash = hashlib.sha512(i).hexdigest() 
    print i, hash, hash == text_compare_hash 
+0

grâce, J'ai eu le même problème en utilisant MD5, j'ai fait la même erreur – clarenswd

1

Le problème ici est que h est déjà créé et plus tard, vous ajouter chaînes à elle, en appelant la méthode update().

Pour résoudre ce, vous pouvez par exemple. re-initialiser h comme nouveau hachage SHA512:

# ... 
for t in texts: 
    h = hashlib.sha512() # <--- here 
    h.update(t) 
    t_hash = str(h.hexdigest()) 
    if t_hash == text_compare_hash: 
     bool_text_hash.append(True) 
    else: 
     bool_text_hash.append(False) 
# ... 
+0

Merci. Je pensais que update() remplacerait la chaîne au lieu de l'ajouter. –

+0

@AfifNajib: Non, il ajoute la chaîne à la chaîne d'origine, donc vous n'avez pas besoin de la passer tout de suite. Il a probablement une telle méthode parce que certains des hashes peuvent ne pas avoir besoin de connaître toute la chaîne à la fois, mais plutôt de les stocker sous une forme déjà traitée. Quoi qu'il en soit 'update()' met à jour l'objet de hachage existant avec une valeur supplémentaire, ne crée pas de nouveau hachage. – Tadeck

0

Il vous manque cette ligne: h = hashlib.sha512()

juste avant h.update (t)

Si vous cochez la python docs (http://docs.python.org/2/library/hashlib.html) il explique que update retournera le résumé de toutes les chaînes données au hashlib jusqu'à présent. Donc, dans votre cas, les chaînes que vous Hashage sont:

loop1: '1beruk Makye'

loop2: '1beruk makye2beruk Makye'

loop3: '1beruk makye2beruk makye3beruk Makye'

Questions connexes