8 votes

Hacher un tableau ou un objet en python 3

Je veux hacher un simple tableau de chaînes de caractères. La documentation indique que vous ne pouvez pas simplement introduire une chaîne dans la fonction update() de hashlib, J'ai donc essayé une variable ordinaire, mais j'ai obtenu le résultat suivant TypeError: object supporting the buffer API required erreur.

Voici ce que j'avais jusqu'à présent

def generateHash(data):
    # Prepare the project id hash
    hashId = hashlib.md5()

    hashId.update(data)

    return hashId.hexdigest()

10voto

pepr Points 4263

Vous pouvez utiliser le repr() pour obtenir la représentation de la chaîne (Unicode) du tableau (ou de tout autre objet qui implémente la conversion en représentation). Ensuite, vous encodez la chaîne en UTF-8 (l'ordre des octets est le même partout lorsque vous utilisez UTF-8). Les octets résultants peuvent être hachés comme vous l'avez essayé ci-dessus :

#!python3
import hashlib

def hashFor(data):
    # Prepare the project id hash
    hashId = hashlib.md5()

    hashId.update(repr(data).encode('utf-8'))

    return hashId.hexdigest()

if __name__ == '__main__':
    data1 = ['abc', 'de']
    data2 = ['a', 'bcde']
    print(hashFor(data1) + ':', data1)
    print(hashFor(data2) + ':', data2)

Il s'imprime sur ma console :

c:\tmp\___python\skerit\so17412304>py a.py
d26d27d8cbb7c6fe50637155c21d5af6: ['abc', 'de']
dbd5ab5df464b8bcee61fe8357f07b6e: ['a', 'bcde']

2voto

Moh Zah Points 232

Selon ce que vous voulez faire, obtenir le hachage de toutes les chaînes de caractères concaténées ou le hachage de chaque chaîne de caractères séparément, vous pouvez obtenir le poing suivant la solution de Thomas comme suit m.update(a) ; m.update(b) est équivalent à m.update(a+b). Ou la solution suivante

def generateHash(data):
    # Prepare the project id hash

    return [hashlib.md5(i.encode('utf-8')).hexdigest() for i in data]

Notez qu'elle renvoie une liste. Chaque élément est un hash d'un élément correspondant dans la liste de chaînes donnée.

1voto

Thomas Orozco Points 15280

Si vous souhaitez hacher une liste de chaînes de caractères, une solution naïve pourrait être :

def hash_string_list(string_list):
    h = hashlib.md5()
    for s in string_list: # Note that you could use ''.join(string_list) instead
        h.update(s)       # s.encode('utf-8') if you're using Python 3
    return h.hexdigest()

Toutefois, il faut se méfier du fait que ['abc', 'efg'] et ['a', 'bcefg'] serait haché à la même valeur.

Si vous fournissez plus de contexte concernant votre objectif, d'autres solutions pourraient être plus appropriées.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X