2017-09-28 6 views
0

Pour ces deux façons de calculer un hachage sha1, en ce qui concerne temps efficacité, sont-ils les mêmes?L'efficacité du calcul de hachage python sha1

(1) diviser la chaîne de petits morceaux et mettre à jour le hachage plusieurs fois

import hashlib 

... 
... 
sha1 = hashlib.sha1() 
sha1.update(chunk1) 
sha1.update(chunk2) 
... 

(2) Passer la chaîne complète à la fonction de hachage et de calculer le hachage une seule fois

import hashlib 
... 
... 
sha1 = hashlib.sha1() 
sha1.update(the_complete_string) 
... 
+0

Je suppose que c'est le temps linéaire par rapport au nombre total d'octets hachés, donc ce serait la même chose. Mais je suis curieux aussi, si quelqu'un peut le prouver. –

+0

** 1 ** Notez que dans Python 3 vous ne pouvez pas passer une chaîne de texte aux fonctions de hachage hashlib, vous devez passer un objet bytes (ou un objet bytearray). ** 2 ** Si vous n'allez pas hacher l'objet en morceaux, évitez les appels '.update' et passez simplement les octets au constructeur, par exemple' sha1 = hashlib.sha1 (b'some octets »). –

+0

** 3 ** Sauf si vous avez besoin d'utiliser sha1 pour la rétrocompatibilité, vous devriez probablement l'éviter puisque [SHA-1 n'est plus considéré comme sûr contre les adversaires bien financés] (https://en.wikipedia.org/wiki/SHA -1). Au lieu de cela, utilisez un hachage de famille SHA plus grand comme sha256, ou l'une des fonctions les plus récentes trouvées dans [hashtab Python 3] (https://docs.python.org/3/library/hashlib.html), par exemple un hachage SHA3, ou BLAKE. –

Répondre

1

Il y a un surcoût supplémentaire pour chaque bloc:

  • vous devez diviser la chaîne
  • Il y a des appels python dans hashlib pour chaque morceau
  • la bibliothèque de hachage doit mettre en place pour gérer chaque morceau

Donc, il y a les frais généraux que les échelles avec le nombre de morceaux. Si vous avez un nombre constant de morceaux, cela n'a probablement pas d'importance. Toutefois, si vous divisiez une chaîne significative en blocs d'un caractère et que vous la mettez à jour à l'aide de chacun de ces blocs d'un caractère, l'approche en segments serait sensiblement plus lente que l'approche de chaîne entière.

Cela dit, il y a les frais généraux en combinant des morceaux en une seule chaîne ou objet octets. Si ce que vous avez sont des morceaux, et que la seule raison pour laquelle vous les combinez est pour la performance de hachage, cela ne vous fera probablement pas gagner du temps.