ó
    HWh')  ã                   óº   • S r SSKrSSKrSSKrSSKrSSKrSSKrSSKr\R                  r	 " S S\
5      r " S S\
5      r " S S\	5      r " S	 S
\5      rSS jrg)zb
Fast cryptographic hash of Python objects, with a special case for fast
hashing of numpy arrays.
é    Nc                   ó   • \ rS rSrSrS rSrg)Ú_ConsistentSeté   zTClass used to ensure the hash of Sets is preserved
whatever the order of its items.
c                 ó”   •  [        U5      U l        g ! [        [        R                  4 a    [        S U 5       5      U l         g f = f)Nc              3   ó8   #   • U  H  n[        U5      v •  M     g 7f©N©Úhash)Ú.0Úes     Ú0/usr/lib/python3/dist-packages/joblib/hashing.pyÚ	<genexpr>Ú*_ConsistentSet.__init__.<locals>.<genexpr>%   s   é € Ð$C²l°¤T¨!§W W²lùs   ‚)ÚsortedÚ	_sequenceÚ	TypeErrorÚdecimalÚInvalidOperation)ÚselfÚset_sequences     r   Ú__init__Ú_ConsistentSet.__init__   sF   € ð		Eô
 $ LÓ1ˆD�NøÜœ7×3Ñ3Ð4ó 	Eô $Ñ$C±lÓ$CÓDˆDŽNð	Eús   ‚ “1AÁA)r   N©Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r   Ú__static_attributes__© ó    r   r   r      s   † ñõEr!   r   c                   ó   • \ rS rSrSrS rSrg)Ú_MyHashé(   z6Class used to hash objects that won't normally pickle c                 ó   • Xl         g r   ©Úargs)r   r'   s     r   r   Ú_MyHash.__init__+   s   € Ø�	r!   r&   Nr   r    r!   r   r#   r#   (   s
   † ÙAõr!   r#   c                   ó&  • \ rS rSrSrSS jrSS jrS rS rS\	R                  4S jr\R                  R                  5       r\\\" \5      '   \\\" \5      '   \\\" \5      '   \\\" \R&                  5      '   S	 rS
 r\\\" \" 5       5      '   Srg)ÚHasheré/   zJA subclass of pickler, to do cryptographic hashing, rather than
pickling.
c                 ó®   • [         R                  " 5       U l        Sn[        R	                  X R                  US9  [
        R                  " U5      U l        g )Né   )Úprotocol)ÚioÚBytesIOÚstreamÚPicklerr   ÚhashlibÚnewÚ_hash)r   Ú	hash_namer.   s      r   r   ÚHasher.__init__4   s=   € Ü—j’j“lˆŒð ˆÜ×Ñ˜Ÿ{™{°XÐÑ>ä—[’[ Ó+ˆ�
r!   c                 óJ  •  U R                  U5        U R                  R                  5       nU R                  R                  U5        U(       a  U R                  R                  5       $ g ! [        R                   a$  nU=R                  SU< SU< 34-  sl        e S nAff = f)NzPicklingError while hashing z: )	ÚdumpÚpickleÚPicklingErrorr'   r1   Úgetvaluer5   ÚupdateÚ	hexdigest)r   ÚobjÚreturn_digestr   Údumpss        r   r
   ÚHasher.hash=   s„   € ð	Ø�I‰I�cŒNð —‘×$Ñ$Ó&ˆØ�
‰
×Ñ˜%Ô ÞØ—:‘:×'Ñ'Ó)Ð)ð øô ×#Ñ#ó 	Ø�F‹F»sÂAÐFÐHÑH�FØûð	ús   ‚A* Á*B"Á>BÂB"c                 óÚ  • [        U[        R                  [        0 R                  5      45      (       a¢  [        US5      (       a  UR                  R                  nOUR                  nUR                  n[        U5      [        [        5      L a  [        X#R                  5      nO1Uc  [        X#5      nO"UR                  R                  n[        X#U5      n[        R                  X5        g )NÚ__func__)Ú
isinstanceÚtypesÚ
MethodTypeÚtypeÚpopÚhasattrrD   r   Ú__self__r:   r#   Ú	__class__r2   Úsave)r   r?   Ú	func_nameÚinstÚclss        r   rM   ÚHasher.saveH   s¦   € Ü�cœE×,Ñ,¬d°2·6±6«lÐ;×<Ñ<ô �s˜J×'Ñ'ØŸL™L×1Ñ1‘	àŸL™L�	Ø—<‘<ˆDÜ�D‹zœT¤&›\Ò)Ü˜i¯©Ó7‘Ø‘ä˜iÓ.‘à—l‘l×,Ñ,�Ü˜i¨sÓ3�Ü�‰�TÕr!   c                 óf   • [        U[        [        45      (       a  g [        R	                  X5        g r   )rE   ÚbytesÚstrr2   Úmemoize)r   r?   s     r   rU   ÚHasher.memoize[   s$   € ô
 �cœE¤3˜<×(Ñ(ØÜ�‰˜Õ"r!   Nc                 ó\  • [        X#S9nUS	  [        R                  " X40 UD6  g ! [        R                   aq    [        R                  " X40 UD6  [        USS 5      nUS:X  aD  UnUc  UR                  n[        R                  U   n[        Xv5      (       d  [        XvU5         g  g  g f = f)N)ÚnameÚpackrY   r   Ú__main__)Údictr2   Úsave_globalr:   r;   Úgetattrr   ÚsysÚmodulesrJ   Úsetattr)r   r?   rX   rY   ÚkwargsÚmoduleÚmy_nameÚmods           r   r\   ÚHasher.save_globalf   s­   € ô ˜4Ñ+ˆØ�6ˆNð	/Ü×Ò Ñ4¨VÓ4øÜ×#Ñ#ó 	/Ü×Ò Ñ4¨VÒ4Ü˜S ,°Ó5ˆFØ˜Ó#Ø�Ø‘?Ø!Ÿl™l�GÜ—k‘k &Ñ)�Ü˜s×,Ñ,ô ˜C¨#Ö.ñ -ñ $ð	/ús   Ž& ¦A>B+Â*B+c           
      óÔ   •  [         R                  U [        [        U5      5      5        g ! [         a2    [         R                  U [        [        S U 5       5      5      5         g f = f)Nc              3   ó@   #   • U  H  u  p[        U5      U4v •  M     g 7fr   r	   )r   ÚkÚvs      r   r   Ú)Hasher._batch_setitems.<locals>.<genexpr>�   s"   é € ð 6IÚBG¹$¸!ô 8<¸A³wÀµlÚBGùs   ‚)r2   Ú_batch_setitemsÚiterr   r   )r   Úitemss     r   rk   ÚHasher._batch_setitems…   sf   € ð
	Kô
 ×#Ñ# D¬$¬v°e«}Ó*=Õ>øÜó 	Kô ×#Ñ# D¬$¬vñ 6IÙBGó6Ió 0Ió +Jö Kð	Kús   ‚(+ «9A'Á&A'c                 óB   • [         R                  U [        U5      5        g r   )r2   rM   r   )r   Ú	set_itemss     r   Úsave_setÚHasher.save_set“   s   € ä�‰�Tœ>¨)Ó4Õ5r!   )r5   r1   )Úmd5)T)r   r   r   r   r   r   r
   rM   rU   ÚstructrY   r\   r2   ÚdispatchÚcopyrH   ÚlenÚobjectr:   r9   rk   rq   Úsetr   r    r!   r   r*   r*   /   s›   † ñô,ô	*ò ò&#ð %)¨v¯{©{ô /ð* ×Ñ×$Ñ$Ó&€Hà%€H‰T�#‹YÑà(€H‰T�&‹\Ñà)€H‰T�'‹]Ñà"-€H‰T�&—+‘+ÓÑòKò6ð %€H‰T‘#“%‹[Ôr!   r*   c                   ó(   • \ rS rSrSrSS jrS rSrg)ÚNumpyHasheréš   z6Special case the hasher for when numpy is loaded.
    c                 ó¦   • X l         [        R                  XS9  SSKnX0l        [        US5      (       a  UR                  U l        g[        U l        g)z¥
Parameters
----------
hash_name: string
    The hash algorithm to be used
coerce_mmap: boolean
    Make no difference between np.memmap and np.ndarray
    objects.
©r6   r   NÚ	getbuffer)	Úcoerce_mmapr*   r   ÚnumpyÚnprJ   r   Ú
_getbufferÚ
memoryview)r   r6   r€   r‚   s       r   r   ÚNumpyHasher.__init__ž   s?   € ð 'ÔÜ�‰˜ˆÑ2ãØŒÜ�2�{×#Ñ#Ø Ÿl™lˆD�Oä(ˆD�Or!   c                 ó2  • [        XR                  R                  5      (       Ga_  UR                  R                  (       GdC  UR
                  S:X  a  UR                  5       nOVUR                  R                  (       a  UnO8UR                  R                  (       a  UR                  nOUR                  5       nU R                  R                  U R                  UR                  U R                  R                  5      5      5        U R                   (       a;  [        XR                  R"                  5      (       a  U R                  R                  nOUR$                  nUSUR                  UR
                  UR&                  44nO~[        XR                  R                  5      (       aZ  U R                  R                  SR)                  S5      5        U R                  R                  [*        R,                  " U5      5        g[.        R1                  X5        g)z‡Subclass the save method, to hash ndarray subclass, rather
than pickling them. Off course, this is a total abuse of
the Pickler class.
r    ÚHASHEDÚ_HASHED_DTYPEzutf-8N)rE   r‚   ÚndarrayÚdtypeÚ	hasobjectÚshapeÚflattenÚflagsÚc_contiguousÚf_contiguousÚTr5   r=   rƒ   ÚviewÚuint8r€   ÚmemmaprL   ÚstridesÚencoder:   rA   r*   rM   )r   r?   Úobj_c_contiguousÚklasss       r   rM   ÚNumpyHasher.save²   s`  € ô
 �cŸ7™7Ÿ?™?×+Ò+°C·I±I×4G×4GÐ4Gð �y‰y˜B‹ð $'§;¡;£=Ñ Ø—‘×'×'Ø#&Ñ Ø—‘×'×'Ø#&§5¡5Ñ ð
 $'§;¡;£=Ð ð �J‰J×ÑØ—‘Ð 0× 5Ñ 5°d·g±g·m±mÓ DÓEôGð ××¤J¨s·G±G·N±N×$CÑ$Cð Ÿ™Ÿ™‘àŸ™�ð
 ˜8 S§Y¡Y°·	±	¸3¿;¹;ÐGÐH‰CÜ˜ŸW™WŸ]™]×+Ñ+ð  �J‰J×Ñ˜o×4Ñ4°WÓ=Ô>Ø�J‰J×ÑœfŸlšl¨3Ó/Ô0ØÜ�‰�DÕr!   )rƒ   r€   r‚   N©rs   F)r   r   r   r   r   r   rM   r   r    r!   r   r{   r{   š   s   † ñô)õ(?r!   r{   c                 ó´   • SnX;  a  [        SR                  X15      5      eS[        R                  ;   a
  [	        XS9nO	[        US9nUR                  U 5      $ )a%  Quick calculation of a hash to identify uniquely Python objects
containing numpy arrays.

Parameters
----------
hash_name: 'md5' or 'sha1'
    Hashing algorithm used. sha1 is supposedly safer, but md5 is
    faster.
coerce_mmap: boolean
    Make no difference between np.memmap and np.ndarray
)rs   Úsha1zAValid options for 'hash_name' are {}. Got hash_name={!r} instead.r�   )r6   r€   r~   )Ú
ValueErrorÚformatr^   r_   r{   r*   r
   )r?   r6   r€   Úvalid_hash_namesÚhashers        r   r
   r
   ô   s^   € ð 'ÐØÓ(Üð 7ç ™&Ð!1Ó=ó?ð 	?ð ”#—+‘+ÓÜ yÑJ‰ä )Ñ,ˆØ�;‰;�sÓÐr!   rš   )r   r:   r3   r^   rF   rt   r/   r   Ú_Picklerr2   rx   r   r#   r*   r{   r
   r    r!   r   Ú<module>r¢      si   ðñó Û Û 
Û Û Û 	Û ð �/‰/€ôE�Vô Eô$ˆfô ôh%ˆWô h%ôVW�&ô Wõtr!   