o
    l¨Êhz(  ã                   @   s¬   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ddlm	Z	m
Z
 e
r,ejZnejZG dd„ deƒZG dd„ deƒZG d	d
„ d
eƒZG dd„ deƒZddd„ZdS )zb
Fast cryptographic hash of Python objects, with a special case for fast
hashing of numpy arrays.
é    Né   )Ú_bytes_or_unicodeÚPY3_OR_LATERc                   @   ó   e Zd ZdZdd„ ZdS )Ú_ConsistentSetza Class used to ensure the hash of Sets is preserved
        whatever the order of its items.
    c              	   C   s@   zt |ƒ| _W d S  ttjfy   t dd„ |D ƒƒ| _Y d S w )Nc                 s   s   � | ]}t |ƒV  qd S ©N©Úhash)Ú.0Úe© r   ú@/var/www/html/env/lib/python3.10/site-packages/joblib/hashing.pyÚ	<genexpr>*   s   € z*_ConsistentSet.__init__.<locals>.<genexpr>)ÚsortedÚ	_sequenceÚ	TypeErrorÚdecimalÚInvalidOperation)ÚselfÚset_sequencer   r   r   Ú__init__   s
   ýz_ConsistentSet.__init__N©Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r   r      s    r   c                   @   r   )Ú_MyHashz7 Class used to hash objects that won't normally pickle c                 G   s
   || _ d S r   )Úargs)r   r   r   r   r   r   0   s   
z_MyHash.__init__Nr   r   r   r   r   r   -   s    r   c                   @   sž   e Zd ZdZddd„Zddd„Zdd	„ Zd
d„ Zdej	fdd„Z
ej ¡ Ze
eeeƒ< e
eeeƒ< e
eeeƒ< e
eeejƒ< dd„ Zdd„ Zeeeeƒ ƒ< dS )ÚHasherzW A subclass of pickler, to do cryptographic hashing, rather than
        pickling.
    Úmd5c                 C   s8   t  ¡ | _tr	dnd}tj| | j|d� t |¡| _d S )Né   é   )Úprotocol)	ÚioÚBytesIOÚstreamr   ÚPicklerr   ÚhashlibÚnewÚ_hash)r   Ú	hash_namer"   r   r   r   r   9   s   
zHasher.__init__Tc              
   C   sl   z|   |¡ W n tjy! } z| jd||f f7  _‚ d }~ww | j ¡ }| j |¡ |r4| j ¡ S d S )Nz"PicklingError while hashing %r: %r)	ÚdumpÚpickleÚPicklingErrorr   r%   Úgetvaluer)   ÚupdateÚ	hexdigest)r   ÚobjÚreturn_digestr   Údumpsr   r   r   r	   B   s   €þ

ÿzHasher.hashc                 C   sŒ   t |tjti jƒfƒr>t|dƒr|jj}n|j}|j}t|ƒtt	ƒkr*t
||jƒ}n|d u r4t
||ƒ}n
|jj}t
|||ƒ}t | |¡ d S )NÚ__func__)Ú
isinstanceÚtypesÚ
MethodTypeÚtypeÚpopÚhasattrr4   r   Ú__self__r,   r   Ú	__class__r&   Úsave)r   r1   Ú	func_nameÚinstÚclsr   r   r   r=   M   s   

zHasher.savec                 C   s   t |tƒrd S t | |¡ d S r   )r5   r   r&   Úmemoize)r   r1   r   r   r   rA   `   s   
zHasher.memoizeNc                 C   s´   t ||d�}tjdkr|d= ztj| |fi |¤Ž W d S  tjyY   tj| |fi |¤Ž t|dd ƒ}|dkrS|}|d u r@|j}tj	| }t
||ƒsVt|||ƒ Y d S Y d S Y d S w )N)ÚnameÚpack)r    é   rC   r   Ú__main__)ÚdictÚsysÚversion_infor&   Úsave_globalr,   r-   Úgetattrr   Úmodulesr:   Úsetattr)r   r1   rB   rC   ÚkwargsÚmoduleÚmy_nameÚmodr   r   r   rI   k   s$   


øøzHasher.save_globalc              
   C   sN   zt  | tt|ƒƒ¡ W d S  ty&   t  | ttdd„ |D ƒƒƒ¡ Y d S w )Nc                 s   s    � | ]\}}t |ƒ|fV  qd S r   r   )r
   ÚkÚvr   r   r   r   –   s   € ÿz)Hasher._batch_setitems.<locals>.<genexpr>)r&   Ú_batch_setitemsÚiterr   r   )r   Úitemsr   r   r   rS   ‹   s   ÿýzHasher._batch_setitemsc                 C   s   t  | t|ƒ¡ d S r   )r&   r=   r   )r   Ú	set_itemsr   r   r   Úsave_set™   s   zHasher.save_set)r   )T)r   r   r   r   r   r	   r=   rA   ÚstructrC   rI   r&   ÚdispatchÚcopyr8   ÚlenÚobjectr,   r+   rS   rW   Úsetr   r   r   r   r   4   s    

	
r   c                   @   s"   e Zd ZdZd	dd„Zdd„ ZdS )
ÚNumpyHasherz7 Special case the hasher for when numpy is loaded.
    r   Fc                 C   sB   || _ tj| |d� ddl}|| _t|dƒr|j| _dS t| _dS )a  
            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Únpr:   r`   Ú
_getbufferÚ
memoryview)r   r*   ra   rc   r   r   r   r   ¤   s   


zNumpyHasher.__init__c                 C   sÚ   t || jjƒrT|jjsT|jdkr| ¡ }n|jjr|}n|jj	r$|j
}n| ¡ }| j |  | | jj¡¡¡ | jrEt || jjƒrE| jj}n|j}|d|j|j|jff}nt || jjƒre|j}|d|jff}t | |¡ dS )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   ÚHASHEDN)r5   rc   ÚndarrayÚdtypeÚ	hasobjectÚshapeÚflattenÚflagsÚc_contiguousÚf_contiguousÚTr)   r/   rd   ÚviewÚuint8ra   Úmemmapr<   ÚstridesÚdescrr   r=   )r   r1   Úobj_c_contiguousÚklassr   r   r   r=   ¸   s&   

ÿ
zNumpyHasher.saveN©r   F)r   r   r   r   r   r=   r   r   r   r   r^       s    
r^   r   Fc                 C   sH   d}||vrt d ||¡ƒ‚dtjv rt||d�}nt|d�}| | ¡S )al   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.rb   )r*   ra   r_   )Ú
ValueErrorÚformatrG   rK   r^   r   r	   )r1   r*   ra   Úvalid_hash_namesÚhasherr   r   r   r	   õ   s   þ


r	   rw   )r   r,   r'   rG   r6   rX   r#   r   Ú_compatr   r   Ú_Picklerr&   r\   r   r   r   r^   r	   r   r   r   r   Ú<module>   s"    	lU