
    .Ph)                         d Z ddlZddlZddlZddlZddlZddlZddlZej        Z	 G d de
          Z G d de
          Z G d de	          Z G d	 d
e          ZddZdS )zb
Fast cryptographic hash of Python objects, with a special case for fast
hashing of numpy arrays.
    Nc                       e Zd ZdZd ZdS )_ConsistentSetz\Class used to ensure the hash of Sets is preserved
    whatever the order of its items.
    c                     	 t          |          | _        d S # t          t          j        f$ r" t          d |D                       | _        Y d S w xY w)Nc              3   4   K   | ]}t          |          V  d S Nhash).0es     N/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/joblib/hashing.py	<genexpr>z*_ConsistentSet.__init__.<locals>.<genexpr>%   s(      $C$CT!WW$C$C$C$C$C$C    )sorted	_sequence	TypeErrordecimalInvalidOperation)selfset_sequences     r   __init__z_ConsistentSet.__init__   sj    		E
 $L11DNNN734 	E 	E 	E $$C$Cl$C$C$CDDDNNNN	Es    4AAN__name__
__module____qualname____doc__r    r   r   r   r      s2         E E E E Er   r   c                       e Zd ZdZd ZdS )_MyHashz5Class used to hash objects that won't normally picklec                     || _         d S r   )args)r   r    s     r   r   z_MyHash.__init__+   s    			r   Nr   r   r   r   r   r   (   s)        ??    r   r   c                   (   e Zd ZdZddZddZd Zd Zdej	        fd	Z
ej                                        Ze
e ee          <   e
e ee          <   e
e ee          <   e
e eej                  <   d
 Zd Zee e e                      <   dS )HasherzA subclass of pickler, to do cryptographic hashing, rather than
    pickling. This is used to produce a unique hash of the given
    Python object that is not necessarily cryptographically secure.
    md5c                     t          j                    | _        d}t                              | | j        |           t          j        |d          | _        d S )N   )protocolF)usedforsecurity)ioBytesIOstreamPicklerr   hashlibnew_hash)r   	hash_namer&   s      r   r   zHasher.__init__5   sM    jll t{X>>>[EBBB


r   Tc                 .   	 |                      |           n/# t          j        $ r}|xj        d|d|fz  c_         d }~ww xY w| j                                        }| j                            |           |r| j                                        S d S )NzPicklingError while hashing z: )	dumppicklePicklingErrorr    r*   getvaluer.   update	hexdigest)r   objreturn_digestr   dumpss        r   r	   zHasher.hash>   s    	IIcNNNN# 	 	 	FFFsssAAFHHFF	 $$&&
%    	*:'')))	* 	*s    A?Ac                    t          |t          j        t          i j                  f          rt          |d          r|j        j        }n|j        }|j        }t          |          t          t                    u rt          ||j                  }n0|t          ||          }n|j        j        }t          |||          }t                              | |           d S )N__func__)
isinstancetypes
MethodTypetypepophasattrr;   r   __self__r2   r   	__class__r+   save)r   r7   	func_nameinstclss        r   rD   zHasher.saveI   s    cE,d26ll;<< 	4 sJ'' )L1		L	<DDzzT&\\))i77i..l,is33T3r   c                 x    t          |t          t          f          rd S t                              | |           d S r   )r<   bytesstrr+   memoize)r   r7   s     r   rK   zHasher.memoize\   s9    
 cE3<(( 	Fc"""""r   Nc                 ^   t          ||          }|d= 	 t          j        | |fi | d S # t          j        $ rr t          j        | |fi | t          |dd           }|dk    rA|}||j        }t          j        |         }t          ||          st          |||           Y d S Y d S Y d S w xY w)N)namepackrN   r   __main__)dictr+   save_globalr2   r3   getattrr   sysmodulesrA   setattr)r   r7   rM   rN   kwargsmodulemy_namemods           r   rQ   zHasher.save_globalg   s     4d+++6N	/c44V44444# 	/ 	/ 	/c44V444S,55F##?!lGk&)sG,, / C#...... $##
/ / /	/s   + A7B,+B,c           
          	 t          j        | t          t          |                    g|R   d S # t          $ r; t          j        | t          t          d |D                                 g|R   Y d S w xY w)Nc              3   >   K   | ]\  }}t          |          |fV  d S r   r   )r
   kvs      r   r   z)Hasher._batch_setitems.<locals>.<genexpr>   s0      !A!A41a477A,!A!A!A!A!A!Ar   )r+   _batch_setitemsiterr   r   )r   itemsr    s      r   r^   zHasher._batch_setitems   s    	
 #D$ve}}*=*=EEEEEEE 	 	 	 #d6!A!A5!A!A!AAABBEI      	s   -1 AA65A6c                 V    t                               | t          |                     d S r   )r+   rD   r   )r   	set_itemss     r   save_setzHasher.save_set   s$    T>)4455555r   )r#   )T)r   r   r   r   r   r	   rD   rK   structrN   rQ   r+   dispatchcopyr?   lenobjectr2   r1   r^   rc   setr   r   r   r"   r"   /   s        
C C C C	* 	* 	* 	*     &# # # %)v{ / / / /* $$&&H%HTT#YY(HTT&\\)HTT']]"-HTT&+  6 6 6 %HTT##%%[[r   r"   c                        e Zd ZdZddZd ZdS )NumpyHasherz1Special case the hasher for when numpy is loaded.r#   Fc                     || _         t                              | |           ddl}|| _        t          |d          r|j        | _        dS t          | _        dS )z
        Parameters
        ----------
        hash_name: string
            The hash algorithm to be used
        coerce_mmap: boolean
            Make no difference between np.memmap and np.ndarray
            objects.
        r/   r   N	getbuffer)	coerce_mmapr"   r   numpynprA   rn   
_getbuffer
memoryview)r   r/   ro   rq   s       r   r   zNumpyHasher.__init__   s_     '	2222{## 	) lDOOO(DOOOr   c                 N   t          || j        j                  r|j        j        s|j        dk    r|                                }n7|j        j        r|}n(|j        j	        r|j
        }n|                                }| j                            |                     |                    | j        j                                       | j        r't          || j        j                  r| j        j        }n|j        }|d|j        |j        |j        ff}nut          || j        j                  r[| j                            d                    d                     | j                            t+          j        |                     dS t.                              | |           dS )zSubclass 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)r<   rq   ndarraydtype	hasobjectshapeflattenflagsc_contiguousf_contiguousTr.   r5   rr   viewuint8ro   memmaprC   stridesencoder2   r9   r"   rD   )r   r7   obj_c_contiguousklasss       r   rD   zNumpyHasher.save   s   
 c47?++ 8	CI4G 8	 yB $';;==  ' 1#&  ' 1#&5  
 $';;==  Jdoo.>.C.CDGM.R.RSSTTT
  &JsDGN$C$C & 
 8SY	3;GHCCTW]++ 	  Jo44W==>>>Jfl3//000FD#r   Nr#   F)r   r   r   r   r   rD   r   r   r   rk   rk      s=        ;;) ) ) )*> > > > >r   rk   r#   Fc                     d}||vr#t          d                    ||                    dt          j        v rt	          ||          }nt          |          }|                    |           S )aI  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
    )r#   sha1zAValid options for 'hash_name' are {}. Got hash_name={!r} instead.rp   )r/   ro   rm   )
ValueErrorformatrS   rT   rk   r"   r	   )r7   r/   ro   valid_hash_nameshashers        r   r	   r	      s     '(((OVV ) 
 
 	

 #+ykJJJ),,,;;sr   r   )r   r   r,   r(   r2   rd   rS   r=   _Picklerr+   rh   r   r   r"   rk   r	   r   r   r   <module>r      s7      				   



 
/E E E E EV E E E&    f   l% l% l% l% l%W l% l% l%^V V V V V& V V Vr     r   