o
    1&il                  
   @   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mZ ddl	m
Z ddlmZ ddlmZ ddlmZmZmZmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZmZmZmZ ej j!Z"e#ede" Z$e#ede" Z%ej j&Z'ej j(Z)e%ej j*Z+ej,j-dkrdndZ.dZ/e/Z0ej1j2Z3ej j4Z5ej j6Z7dd Z8ee8dd Z9ee:dd Z;edd Z<ee%e%ej=ej>ej>e%ej>dddd Z?edd Z@edd  ZAee%e%e%e%e%e%ejBejBd!dd"d# ZCeejDd$eejEd$d%d& ZFeejGd$d'd( ZHeejId$d)d* ZJe%j-d+ d,kr(e%d-ZKe%d.ZLe%d/ZMed0ejNidd1d2 ZOne%d3ZKe%d4ZLe%d5ZMed0ejNidd6d2 ZOee%e%e%e%e%d7dd8d9 ZPeejQd$d:d; ZRdd<lmSZSmTZTmUZUmVZVmWZWmXZX G d=d> d>eWZYG d?d@ d@eWZZG dAdB dBeWZ[G dCdD dDeWZ\G dEdF dFeXZ]edGdHdIgZ^dJdK Z_e_ Z`e7dLv re7dMkrdNZaebea eejNejNdOddPdQ ZceejNejNejNejNejNejNdRddSdT ZdeejNejNejNejNdUddVdW ZeeejNejNejNejNdUddXdY ZfdZd[ Zgegd\Zhegd]Zie7d\krehneiZjnd^e7 Zaekeaed_d` Zldadb Zmeemdcdd Znedee%iddfdg Zoeejpd$dhdi ZqdS )jz&
Hash implementations for Numba types
    N)
namedtuple)ir)literal_unroll)overloadoverload_method	intrinsicregister_jitable)errors)types)	grab_bytegrab_uint64_t)	const_intget_next_intget_next_int32get_state_ptrzint%szuint%s       =   iCB c                 C   s   d S N )	hash_funcr   r   @C:\wamp64\www\opt\env\Lib\site-packages\numba/cpython/hashing.py_defer_hash/   s   r   c                    s   d|  d  fdd}|S )Nzunhashable type: ''c                    s   |d u rt  | S r   )	TypeError)objr   err_msgr   r   impl7   s   zol_defer_hash.<locals>.implr   )r   r   r   r   r   r   ol_defer_hash3   s   r   c                    s   d|  d  fdd}|S )Nz+No __hash__ is defined for object of type 'zn' and a generic hash() cannot be performed as there is no suitable object represention in Numba compiled code!c                    s"   t | drt| t| dS t )N__hash__)hasattrr   getattrr   )r   Zattempt_generic_msgr   r   r   G   s   
zhash_overload.<locals>.implr   )r   r   r   r#   r   hash_overload@   s
   r$   c                 C   s    t | }|tdkrtd}|S )N)
_Py_hash_tint)valZasintr   r   r   process_returnO   s   r*   )xymesign_PyHASH_MODULUS_PyHASH_BITSlocalsc                 C   s  t | st | r| dkrtS t S t }t|S t| \}}d}|dk r,d}| }d}|rZ|d> t@ |t	d ? B }|d9 }|d8 }t
|}||8 }||7 }|tkrX|t8 }|s0|dkrc|t	 }n
t	d d| t	  }||> t@ |t	| ? B }|| }t|S )Nr      r%      g      A)npisfiniteisinf_PyHASH_INF_prng_random_hashr*   mathfrexpr0   r1   r(   )vr+   r-   r.   r/   r,   r   r   r   _Py_HashDouble^   s:   



r>   c                 C   s   dd }t t j}||fS )Nc                 S   s   |d }| |t S )Nr   )Zfpextr   Z
DoubleType)cgctxbuilder	signatureargsr)   r   r   r   r      s   z_fpext.<locals>.impl)r
   float64Zfloat32)tyctxr)   r   sigr   r   r   _fpext   s   rF   c                 C   s   dd }t  }||fS )Nc                 S   s@   t | |d}tt}tdkrt| ||}|S t| |||d}|S )NZinternalr   F)r   r   _hash_widthr   r   )r?   r@   rA   rB   Z	state_ptrbitsvaluer   r   r   r      s   	z_prng_random_hash.<locals>.impl)r'   )rD   r   rE   r   r   r   r:      s   r:   )r+   p1p2p3p4r0   r1   _PyLong_SHIFTc           
      C   s   dt  }td |? }dt  d }d}tt  }t|d ddD ]'}|t > }|t@ }||? }	||	B }|t| |t  ? |@ 7 }|tkrG|t8 }q t|S )Nr   r   @   r4   r%   )rN   r
   Zuint32r1   ranger0   r'   )
r)   Z
_tmp_shiftZ
mask_shiftir+   rL   idxrJ   rK   rM   r   r   r   
_long_impl   s   rS   r    c                    sH   t jdkrdndtdt| ddrtjntj  fdd}|S )	Nl        r&   l         signedFc                    s    | } t | }|tk r*| dkrd}t|S | kr"t}t|S t| }t|S d}| dk r5|  } d}t| }|r>| }t|S )Nr   FT)absr0   r'   rS   r*   )r)   magretZneeds_negateZ_BIGZ_HASH_I64_MINZ_SIGNED_MINr   r   r      s&   
	zint_hash.<locals>.impl)sysmaxsizer
   Zint64r"   uint64r)   r   r   rY   r   int_hash   s
   
r^   c                 C   s"   | j dkrdd }|S dd }|S )NrO   c                 S   s   t | }|S r   )r>   )r)   hashedr   r   r   r     s   zfloat_hash.<locals>.implc                 S   s   t t| }t|}|S r   )r6   rC   rF   r>   )r)   Z
fpextendedr_   r   r   r   r     s   )bitwidthr]   r   r   r   
float_hash  s
   
	ra   c                 C      dd }|S )Nc                 S   s(   t | j}t | j}|t|  }t|S r   )hashrealimag_PyHASH_IMAGr*   )r)   ZhashrealZhashimagcombinedr   r   r   r   #  s   

zcomplex_hash.<locals>.implr   r]   r   r   r   complex_hash!  s   
rh         l   Jfq	 l   OkO8 l   g,,> r+   c                 C      | t d> | t d? B S )Nr   !   r
   r\   r+   r   r   r   _PyHASH_XXROTATE;     ro   l   yn< l   wJ igVc                 C   rk   )N      rm   rn   r   r   r   ro   D  rp   )acclane_PyHASH_XXPRIME_5_PyHASH_XXPRIME_1tlc                 C   s   t | }t}t| D ]}t|}|tdkr dS ||t 7 }t|}|t9 }q
||ttdA A 7 }|tdkr<tdS t|S )Nr%   is5 iK*\)	lenru   r   rc   _Py_uhash_t_PyHASH_XXPRIME_2ro   rv   r*   )tuprw   rs   r+   rt   r   r   r   _tuple_hashJ  s   
r|   c                 C   rb   )Nc                 S      t | S r   )r|   )r)   r   r   r   r   c     ztuple_hash.<locals>.implr   r]   r   r   r   
tuple_hasha     r   )c_size_tc_ubytec_uint64	pythonapi	StructureUnionc                   @      e Zd ZdefdefgZdS )FNVprefixsuffixN)__name__
__module____qualname__r   _fields_r   r   r   r   r         r   c                   @   r   )SIPHASHk0k1N)r   r   r   r   r   r   r   r   r   r     r   r   c                   @       e Zd Zded fdefgZdS )DJBX33Apadding   r   Nr   r   r   r   r   r   r   r   r   r   r         
r   c                   @   r   )EXPATr   r   ZhashsaltNr   r   r   r   r   r     r   r   c                   @   s2   e Zd Zded fdefdefdefdefgZdS )_Py_HashSecret_tZuc   fnvsiphashdjbx33aexpatN)	r   r   r   r   r   r   r   r   r   r   r   r   r   r     s    
r   _hashsecret_entrysymbolrI   c                     sJ   t td} i   fdd}|d| jj |d| jj |d| jj  S )zRead hash secret from the Python process

    Returns
    -------
    info : dict
        - keys are "djbx33a_suffix", "siphash_k0", siphash_k1".
        - values are the namedtuple[symbol:str, value:int]
    Z_Py_HashSecretc                    s>   d | }t|}t|}t|| t||d | < d S )Nz_numba_hashsecret_{})r   rI   )formatctypesr   	addressofllZ
add_symbolr   )namer)   Zsymbol_nameaddrinfor   r   inject  s
   


z!_build_hashsecret.<locals>.injectdjbx33a_suffix
siphash_k0
siphash_k1)r   in_dllr   r   r   r   r   r   )Zpyhashsecretr   r   r   r   _build_hashsecret  s   r   )	siphash13	siphash24r   r   a  FNV hashing is not implemented in Numba. See PEP 456 https://www.python.org/dev/peps/pep-0456/ for rationale over not using FNV. Numba will continue to work, but hashes for built in types will be computed using siphash24. This will permit e.g. dictionaries to continue to behave as expected, however anything relying on the value of the hash opposed to hash as a derived property is likely to not work as expected.r+   bc                 C   s    t | |> | t d| ? B S )NrO   rm   r   r   r   r   _ROTATE  s    r   ar   cdstc                 C   sB   | |7 } ||7 }t ||| A }t |||A }t | d} | |||fS )Nr   )r   r   r   r   r   _HALF_ROUND  s   
r   v0v1v2v3c                 C   s@   t | |||dd\} }}}t ||| |dd\}}} }| |||fS )Nrq   r         )r   r   r   r   r   _SINGLE_ROUND  s   r   c                 C   s8   t | |||\} }}}t | |||\} }}}| |||fS r   )r   r   r   r   r   _DOUBLE_ROUND(  s   r   c                    sr   | dkr	t d n| dkrtd nJ dttjtjtjtjtjtjtjtjtjtjd
d fd	d
}|S )Nr   Tr   Fr   Zunreachable)
r   r   r   r   r   mir   maskjmpohexefefr2   c                    s   t |d> }| t dA }|t dA }| t dA }|t dA }d}	|dkrMt||	}
|	d7 }	|d8 }||
N }||||\}}}}||
N }|dks)t d}|	d }t d	}|d
kryd}t ||>  }||@ t t||d |> B }|dkrd}t ||>  }||@ t t||d |> B }|dkrd}t ||>  }||@ t t||d |> B }|dkr|t dM }tdD ]}|d }t ||>  }||@ t t||| |> B }q|dkrd}t ||>  }||@ t t||d |> B }|dkr!d}t ||>  }||@ t t||d |> B }|dkr7| }||@ t t||d B }||O }||N }||||\}}}}||N }||N }||||\}}}}||||\}}}} rv||||\}}}}||A ||A A }|S )N8   l   ue`5{ l   mo\I{# l   ar\c l   ser+# r   ri   r4         0      (      r   rj   l           r      )r
   r\   r   r   rP   )r   r   srcZsrc_szr   r   r   r   r   rR   r   r   Zboffsetr   r   r   rQ   Z_EXTRA_ROUNDZ_ROUNDERr   r   _siphash;  s   






z_gen_siphash.<locals>._siphash)r   r   r   r
   r\   )algr   r   r   r   _gen_siphash1  s(   
Er   r   r   z'Unsupported hashing algorithm in use %sc                    sD   t |tjstdt|j j tj}||} fdd}||fS )z&Emit code to load the hashsecret.
    zrequires literal stringc                    sL   |j }z| }W n ty   tj|td d}Y nw ||}|S )NrO   r   )moduleZ
get_globalKeyErrorr   ZGlobalVariableZIntTypeload)r?   r@   rE   rB   modgvr=   symr   r   r     s   
z%_inject_hashsecret_read.<locals>.impl)	
isinstancer
   ZStringLiteralr	   ZTypingError_hashsecretZliteral_valuer   r\   )rD   r   ZrestyrE   r   r   r   r   _inject_hashsecret_read  s   
r   c                 C   s
   t |  jS r   )r   rI   r   r   r   r   _load_hashsecret  s   
r   c                 C   rb   )Nc                 S   r}   r   )r   r   r   r   r   imp  r~   z"_impl_load_hashsecret.<locals>.impr   )r   r   r   r   r   _impl_load_hashsecret  r   r   _hashc                 C   s   |dkrt dS |tk r3td}t|D ]}|d> | tt| | }q||N }|tdN }t |S tt	
tdt	
td| |}t |}t |S )Nr   i  r   r   r   r   )r*   _Py_HASH_CUTOFFry   rP   r6   Zuint8r   r   
_siphasherr
   r\   )r)   _lenr   rR   tmpr   r   r   _Py_HashBytes  s   r   c                    s   ddl m   fdd}|S )Nr   _kind_to_byte_widthc                    s4    | j }t| }| j}|dkr|S t| j|| S )Nr%   )_kindrx   r   r   _data)r)   Z	kindwidthr   Zcurrent_hashr   r   r   r     s   
zunicode_hash.<locals>.impl)Znumba.cpython.unicoder   r]   r   r   r   unicode_hash  s   r   )r__doc__r;   numpyr6   rZ   r   warningscollectionsr   Zllvmlite.bindingZbindingr   Zllvmliter   Znumbar   Znumba.core.extendingr   r   r   r   Z
numba.corer	   r
   Znumba.core.unsafe.bytesr   r   Znumba.cpython.randomimplr   r   r   r   	hash_infowidthrG   r"   r'   ry   infr9   nanZ_PyHASH_NANmodulusr0   Zintpr`   r1   Z_PyHASH_MULTIPLIERrf   int_infobits_per_digitrN   cutoffr   	algorithmZ_Py_hashfunc_namer   r   rc   r$   r*   doubleZintcr>   rF   r:   Zint32rS   IntegerBooleanr^   Floatra   Complexrh   rv   rz   ru   r\   ro   r|   Z	BaseTupler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   msgwarnr   r   r   r   r   Z
_siphash13Z
_siphash24r   
ValueErrorr   r   r   r   ZUnicodeTyper   r   r   r   r   <module>   s   



.





,






 



/



[




