B
     \T                 @   s6  d Z ddlmZmZmZ ddlZddlZddlZddl	m
  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mZ ejdd d	kZer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*Z+ej,j-Z.ejj/Z0ejj1Z2nxej'j(Zeed
e Zeede Z dZ"dZ$ej'j(dkrNdndZ)e de)> d Z&dZ*e*Z+ej'j(dkr|dndZ.dZ0dZ2ee3dd Z4edd Z5ee e ej6ej7ej7e ej7dddd Z8edd Z9ee e e e e e ej:ej:e d 	dd!d" Z;eej<d#eej=d#d$d% Z>eej?d#d&d' Z@eejAd#d(d) ZBee ee ed*dd+d, ZCed-d. ZDeejEd#d/d0 ZFdd1lGmHZHmIZImJZJmKZKmLZLmMZM G d2d3 d3eLZNG d4d5 d5eLZOG d6d7 d7eLZPG d8d9 d9eLZQG d:d; d;eMZReRSeKd<ZTeTjUZVeTjUjWZXeTjYjZZ[eTjYj\Z]e2dkreej^ej^d=dd>d? Z_eej^ej^ej^ej^ej^ej^d@ddAdB Z`eej^ej^ej^ej^dCddDdE Zaeej^ej^ej^ej^ej^ej^ebej^ddFej^ej^ej^ej^dGddHdI Zcn$e2dJkreddKndLe2 ZeefeeedMe iddNdO Zgeejhd#dPdQ ZidS )Rz&
Hash implementations for Numba types
    )print_functionabsolute_importdivisionN)ir)overloadoverload_method	intrinsicregister_jitable)types)	grab_bytegrab_uint64_t   )      zint%szuint%s       =   iCB i/    @         Z	siphash24c             C   s   dd }|S )Nc             S   s   |   S )N)__hash__)obj r   4lib/python3.7/site-packages/numba/targets/hashing.pyimpl<   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_returnA   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 ntS t| \}}d}|dk rPd}| }d}xX|r|d> t@ |td ? B }|d9 }|d8 }t	|}||8 }||7 }|tkrV|t8 }qVW |dkr|t }ntd d| t  }||> t@ |t| ? B }|| }t
|S )Nr   r   r      g      A)npZisfiniteZisinf_PyHASH_INF_PyHASH_NANmathZfrexpr(   r)   r    r"   )vr%   r&   r'   r#   r$   r   r   r   _Py_HashDoubleL   s6    


r1   c             C   s   dd }t t j}||fS )Nc             S   s   |d }| |tj S )Nr   )ZfpextlcZTypedouble)cgctxbuilder	signatureargsr!   r   r   r   r   ~   s    z_fpext.<locals>.impl)r
   float64Zfloat32)tyctxr!   r   sigr   r   r   _fpext|   s    r;   )	r#   p1p2p3p4r(   r)   _PyLong_SHIFTzx.1c       
      C   s   dt  }td |? }dt  d }d}tt  }xbt|d ddD ]N}|t > }|t@ }||? }	||	B }|t| |t  ? |@ 7 }|tkrB|t8 }qBW t|S )Nr   r   r   r   r   )r@   r
   Zuint32r)   ranger(   r   )
r!   Z
_tmp_shiftZ
mask_shiftir#   r>   idxr<   r=   r?   r   r   r   
_long_impl   s    rD   r   c                s"   t jdkrdnd  fdd}|S )Nl        r   c                sl   t | }|tk r<| |  kr2| dkr(d}q:t }qdt| }n(d}| dk rR|  } d}t| }|rd| }t|S )Nr   FT)absr(   r   rD   r"   )r!   ZmagZretZneeds_negate)_HASH_I64_MINr   r   r      s    



zint_hash.<locals>.impl)sysmaxsize)r!   r   r   )rG   r   int_hash   s    rJ   c             C   s    | j dkrdd }ndd }|S )Nr   c             S   s   t | }|S )N)r1   )r!   hashedr   r   r   r      s    zfloat_hash.<locals>.implc             S   s   t t| }t|}|S )N)r,   r8   r;   r1   )r!   Z
fpextendedrK   r   r   r   r      s    )bitwidth)r!   r   r   r   r   
float_hash   s    

rM   c             C   s   dd }|S )Nc             S   s(   t | j}t | j}|t|  }t|S )N)hashrealimag_PyHASH_IMAGr"   )r!   ZhashrealZhashimagZcombinedr   r   r   r      s    

zcomplex_hash.<locals>.implr   )r!   r   r   r   r   complex_hash   s    
rR   )r#   r$   multlc             C   s~   t | }t}td}xTtt|d ddD ]<\}}t| | }||A }|| }|ttd| | 7 }q*W |td7 }t|S )NixV4 r   r   iXB i| )len_PyHASH_MULTIPLIER_Py_uhash_t	enumeraterA   rN   r   r"   )tuptlrS   r#   rB   rT   r$   xxoryr   r   r   _tuple_hash   s    r\   c                s    fdd}t |}||fS )Nc                s  | j }|t}|j\}|\}| |j}t|d}	t|t}
t|d}t	|}xt
t|jt|d ddD ]\}}|\}}| |fi }| ||}|||}|||f}||	|}|||
}	t||}||
|}
||
|}
||
|}
qtW ||	t|d}	|	S )NixV4 iXB r   r   i| )Ztyping_contextZresolve_value_typerN   r7   Zget_value_typeZreturn_typer   ZConstantrV   rU   rX   zipr
   rA   Zget_call_typeZget_functionZextract_valuexormuladd)r4   r5   r6   r7   Z	typingctxZfntyZtuptyrY   Zltyr#   rS   shiftrZ   rB   ZpackedZtyrT   r:   r   Z	tuple_valr$   r[   Zlconst)r9   r   r   r     s.    
&z!_tuple_hash_resolve.<locals>.impl)r   )r9   r!   r   r:   r   )r9   r   _tuple_hash_resolve  s    rb   c             C   s(   t | tjrdd }|S dd }|S d S )Nc             S   s   t | S )N)r\   )r!   r   r   r   r   9  s    ztuple_hash.<locals>.implc             S   s   t t| }t|S )N)r   rb   r"   )r!   rK   r   r   r   r   =  s    )
isinstancer
   Sequence)r!   r   r   r   r   
tuple_hash6  s
    re   )c_size_tc_ubytec_uint64	pythonapi	StructureUnionc               @   s   e Zd ZdefdefgZdS )FNVprefixsuffixN)__name__
__module____qualname__rf   _fields_r   r   r   r   rl   [  s   rl   c               @   s   e Zd ZdefdefgZdS )SIPHASHk0k1N)ro   rp   rq   rh   rr   r   r   r   r   rs   b  s   rs   c               @   s    e Zd Zded fdefgZdS )DJBX33Apadding   rn   N)ro   rp   rq   rg   rf   rr   r   r   r   r   rv   i  s   
rv   c               @   s    e Zd Zded fdefgZdS )EXPATrw   rx   ZhashsaltN)ro   rp   rq   rg   rf   rr   r   r   r   r   ry   p  s   
ry   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djbx33aZexpatN)	ro   rp   rq   rg   rl   rs   rv   ry   rr   r   r   r   r   rz   w  s
   
rz   Z_Py_HashSecret)r#   bc             C   s    t | |> | t d| ? B S )Nr   )r
   uint64)r#   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   r   r   r   r   r   _HALF_ROUND  s    
r   )v0v1v2v3c             C   st   t | |||dd\} }}}t ||| |dd\}}} }t | |||dd\} }}}t ||| |dd\}}} }| |||fS )N   rx         )r   )r   r   r   r   r   r   r   _DOUBLE_ROUND  s
    r   C)r   r   r   r   r   mitmpr   maskjmpohexefefc             C   s  t |d> }| t dA }|t dA }| t dA }|t dA }d}	xL|dkrt||	}
|	d7 }	|d8 }||
N }t||||\}}}}||
N }qLW t d}|	d }t d	}|d
krd}t ||>  }||@ t t||d |> B }|dkr.d}t ||>  }||@ t t||d |> B }|dkrld}t ||>  }||@ t t||d |> B }|dkr|t dM }xJtdD ]>}|d }t ||>  }||@ t t||| |> B }qW |dkrd}t ||>  }||@ t t||d |> B }|dkrLd}t ||>  }||@ t t||d |> B }|dkrx| }||@ t t||d B }||O }||N }t||||\}}}}||N }||N }t||||\}}}}t||||\}}}}||A ||A A }|S )N8   l   ue`5{ l   mo\I{# l   ar\c l   ser+# r      r         0      (      r   r   l        r   rx   r   )r
   r   r   r   r   rA   )rt   ru   srcZsrc_szr   r   r   r   r   rC   r   r   Zboffsetr   r   r   rB   r   r   r   
_siphash24  sl    



 
 
 
&
 
 
r   r|   zFNV hashing is not implementedz'Unsupported hashing algorithm in use %s_hashc             C   s   |dkrt dS |tk r`td}x,t|D ] }|d> | tt| | }q*W ||N }|tN }n"tt	
tt	
t| |}t |}t |S )Nr   i  r   )r"   _Py_HASH_CUTOFFrW   rA   r,   Zuint8r   _Py_HashSecret_djbx33a_suffixr   r
   r   _Py_HashSecret_siphash_k0_Py_HashSecret_siphash_k1)r!   _lenr   rC   r   r   r   r   _Py_HashBytes(  s     

r   c                s   ddl m   fdd}|S )Nr   )_kind_to_byte_widthc                s8    | j }t| }| j}|dkr$|S t| j|| S d S )Nr   )Z_kindrU   r   r   _data)r!   Z	kindwidthr   Zcurrent_hash)r   r   r   r   E  s    
zunicode_hash.<locals>.impl)Znumba.unicoder   )r!   r   r   )r   r   unicode_hashA  s    r   )j__doc__Z
__future__r   r   r   r/   Znumpyr,   rH   Zllvmlite.llvmpy.coreZllvmpyZcorer2   Zllvmliter   Znumba.extendingr   r   r   r	   Znumbar
   Znumba.unsafe.bytesr   r   version_infoZ_py34_or_later	hash_infowidthZ_hash_widthgetattrr   rW   infr-   nanr.   modulusr(   ZintprL   r)   rV   rQ   int_infobits_per_digitr@   cutoffr   	algorithmZ_Py_hashfunc_namerN   r   r"   r3   Zintcr1   r;   Zint32rD   ZIntegerZBooleanrJ   ZFloatrM   ZComplexrR   r\   rb   Z	BaseTuplere   Zctypesrf   rg   rh   ri   rj   rk   rl   rs   rv   ry   rz   Zin_dllZ_Py_hashSecretr~   Z_Py_HashSecret_djbx33arn   r   r}   rt   r   ru   r   r   r   r   r   ZArrayr   NotImplementedErrormsg
ValueErrorr   ZUnicodeTyper   r   r   r   r   <module>   s   
*
( 

)	>

