
    ܙd4j                     "	   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mZ dd	lmZmZ dd
lmZmZmZm Z  ej!        dk    Z"ej#        j$        Z% e&ede%z            Z' e&ede%z            Z(ej#        j)        Z*ej#        j+        Z, e(ej#        j-                  Z.ej/        j0        dk    rdndZ1dZ2e2Z3ej4        j5        Z6ej#        j7        Z8ej#        j9        Z:d Z; ee;          d             Z< ee=          d             Z>ed             Z? ee(e(ej@        ejA        ejA        e(ejA        d          d             ZBed             ZCed             ZD ee(e(e(e(e(e(ejE        ejE        d          d             ZF eejG        d           eejH        d          d                         ZI eejJ        d          d             ZK eejL        d          d              ZMe(j0        d!z  d"k    r> e(d#          ZN e(d$          ZO e(d%          ZP ed&ejQ        i          d'             ZRn= e(d(          ZN e(d)          ZO e(d*          ZP ed&ejQ        i          d+             ZR ee(e(e(e(e(d,          d-             ZS eejT        d          d.             ZUdd/lmVZVmWZWmXZXmYZYmZZZm[Z[  G d0 d1eZ          Z\ G d2 d3eZ          Z] G d4 d5eZ          Z^ G d6 d7eZ          Z_ G d8 d9e[          Z` ed:d;d<g          Zad= Zb eb            Zce:d>v re:d?k    rd@Zd eje        ed            eejQ        ejQ        dA          dB             Zf eejQ        ejQ        ejQ        ejQ        ejQ        ejQ        dC          dD             Zg eejQ        ejQ        ejQ        ejQ        dE          dF             Zh eejQ        ejQ        ejQ        ejQ        dE          dG             ZidH Zj ejdI          Zk ejdJ          Zle:dIk    reknelZmndKe:z  Zd ened          edL             ZodM Zp eep          dN             Zq edOe(i          dP             Zr eejs        d          dQ             ZtdS )Rz&
Hash implementations for Numba types
    N)
namedtuple)ir)literal_unroll)overloadoverload_method	intrinsicregister_jitable)errors)typesutils)	grab_bytegrab_uint64_t)	const_intget_next_intget_next_int32get_state_ptr)   
   zint%szuint%s       =   iCB c                     d S N )	hash_funcs    5lib/python3.11/site-packages/numba/cpython/hashing.py_defer_hashr   1   s    D    c                     d|  dfd}|S )Nzunhashable type: ''c                 :    |t                     |            S r   )	TypeError)objr   err_msgs     r   implzol_defer_hash.<locals>.impl9   s#    G$$$9;;r   r   )r#   r   r%   r$   s      @r   ol_defer_hashr&   5   s3    )3)))G    
 Kr   c                     d|  df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                 ~    t          | d          rt          | t          | d                    S t                    )N__hash__)hasattrr   getattrr"   )r#   attempt_generic_msgs    r   r%   zhash_overload.<locals>.implI   s>    3
## 	1sGC$<$<===/000r   r   )r#   r%   r,   s     @r   hash_overloadr-   B   sA    B"B B B
1 1 1 1 1
 Kr   c                 h    t          |           }|t          d          k    rt          d          }|S )N)
_Py_hash_tint)valasints     r   process_returnr5   Q   s.    sOOERBLr   )xymesign_PyHASH_MODULUS_PyHASH_BITSlocalsc                 |   t          j        |           sTt          j        |           r| dk    rt          S t           S t          rt                      }t          |          S t          S t          j	        |           \  }}d}|dk     rd}| }d}|rU|dz  t          z  |t          dz
  z	  z  }|dz  }|dz  }t          |          }||z  }||z  }|t          k    r
|t          z  }|U|dk    r|t          z  }nt          dz
  d|z
  t          z  z
  }||z  t          z  |t          |z
  z	  z  }||z  }t          |          S )Nr      r/      g      A)npisfiniteisinf_PyHASH_INF_py310_or_later_prng_random_hashr5   _PyHASH_NANmathfrexpr;   r<   r2   )vr6   r8   r9   r:   r7   s         r   _Py_HashDoublerL   `   sm    ;q>> #HQKK 	#A""#|#  #%''%a((("":a==DAqD	AB 	
A !2g(A,2C,DD	[	RFF	Q	Q A  ! 	Avv1a< 78
q&O	#q\A-='>>A	DA!r   c                 L    d }t          j        t           j                  }||fS )Nc                 `    |d         }|                     |t          j                              S )Nr   )fpextr   
DoubleType)cgctxbuilder	signatureargsr3   s        r   r%   z_fpext.<locals>.impl   s%    1g}}S"-//222r   )r   float64float32)tyctxr3   r%   sigs       r   _fpextrY      s.    3 3 3 -
&
&C9r   c                 ,    d }t                      }||fS )Nc                     t          | |d          }t          t                    }t          dk    rt          | ||          }nt	          | |||d          }|S )Ninternalr   F)r   r   _hash_widthr   r   )rQ   rR   rS   rT   	state_ptrbitsvalues          r   r%   z_prng_random_hash.<locals>.impl   sZ    !%*==	%% ""5'9==EE D%HHEr   )r1   )rW   r%   rX   s      r   rG   rG      s&      $ ,,C9r   )r6   p1p2p3p4r;   r<   _PyLong_SHIFTc                 ~   dt           z
  }t          j        d           |z	  }dt           z  dz   }d}t          t           z
  }t	          |dz
  dd          D ]Z}|t           z  }|t
          z  }||z	  }	||	z  }|t          j        | |t           z  z	  |z            z  }|t
          k    r
|t
          z  }[t          |          S )Nr   r   @   r@   r/   )re   r   uint32r<   ranger;   r1   )
r3   
_tmp_shift
mask_shiftir6   rc   idxra   rb   rd   s
             r   
_long_implrn      s     m#J<$$$3J 
}	!A 	
A

&BQUB## ! !-/!"WG	U\3#"55CDDD Aa==r   r)   c                     t           j        dk    rdndt          j        d          t	          | dd          rt          j        nt          j        fd}|S )Nl        r0   l         signedFc                     |           } t          |           }|t          k     r/| dk    rd}nG| k    rt                    }n1t          |           }n!d}| dk     r|  } d}t          |           }|r| }t	          |          S )Nr   FT)absr;   r1   rn   r5   )r3   magretneeds_negate_BIG_HASH_I64_MIN_SIGNED_MINs       r   r%   zint_hash.<locals>.impl   s     d3ii#hh  axx## // oo LQwwd#S//C dc"""r   )sysmaxsizer   int64r+   uint64)r3   r%   rw   rx   ry   s     @@@r   int_hashr~      sv     +00BBbM+122K "#x77I5;;U\D# # # # # # #8 Kr   c                 *    | j         dk    rd }nd }|S )Nrg   c                 $    t          |           }|S r   )rL   )r3   hasheds     r   r%   zfloat_hash.<locals>.impl  s    #C((FMr   c                 f    t          j        t          |                     }t          |          }|S r   )rB   rU   rY   rL   )r3   
fpextendedr   s      r   r%   zfloat_hash.<locals>.impl  s)    F3KK00J#J//FMr   )bitwidthr3   r%   s     r   
float_hashr     s9    
|r	 	 	 		 	 	
 Kr   c                     d }|S )Nc                     t          | j                  }t          | j                  }|t          |z  z   }t	          |          S r   )hashrealimag_PyHASH_IMAGr5   )r3   hashrealhashimagcombineds       r   r%   zcomplex_hash.<locals>.impl(  s;    >>>> lX55h'''r   r   r   s     r   complex_hashr   &  s    	( 	( 	( Kr         l   Jfq	 l   OkO8 l   g,,> r6   c                 `    | t          j        d          z  | t          j        d          z	  z  S )Nr   !   r   r}   r6   s    r   _PyHASH_XXROTATEr   @  -     el2&&&1R0@0@+@ABr   l   yn< l   wJ igVc                 `    | t          j        d          z  | t          j        d          z	  z  S )N      r   r   s    r   r   r   I  r   r   )acclane_PyHASH_XXPRIME_5_PyHASH_XXPRIME_1tlc                    t          |           }t          }t          |           D ]M}t          |          }|t	          d          k    r dS ||t
          z  z  }t          |          }|t          z  }N||t          t	          d          z  z  z  }|t	          d          k    rt          d          S t          |          S )Nr/   is5 iK*\)	lenr   r   r   _Py_uhash_t_PyHASH_XXPRIME_2r   r   r5   )tupr   r   r6   r   s        r   _tuple_hashr   O  s    
 
SB
CC   ! !Aww;r??""22t'''s##  2"[%9%99::C
k"ooj)))#r   c                     d }|S )Nc                      t          |           S r   )r   )r3   s    r   r%   ztuple_hash.<locals>.implh  s    3r   r   r   s     r   
tuple_hashr   f  s         Kr   )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     s%        	8	8HHHr   r   c                       e Zd ZdefdefgZdS )SIPHASHk0k1N)r   r   r   r   r   r   r   r   r   r     s%        	x	xHHHr   r   c                   $    e Zd Zdedz  fdefgZdS )DJBX33Apadding   r   Nr   r   r   r   r   r   r   r   r   r   r     s)        	GbL!	8HHHr   r   c                   $    e Zd Zdedz  fdefgZdS )EXPATr   r   hashsaltNr   r   r   r   r   r     s)        	GbL!	XHHHr   r   c                   6    e Zd Zdedz  fdefdefdefdefgZdS )_Py_HashSecret_tuc   fnvsiphashdjbx33aexpatN)	r   r   r   r   r   r   r   r   r   r   r   r   r   r     sB         
w|		G	G	%
HHHr   r   _hashsecret_entrysymbolr`   c                      t                               t          d          } i f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]
    _Py_HashSecretc                     d                     |           }t          j        |          }t          j        |          }t	          j        ||           t          ||          | <   d S )Nz_numba_hashsecret_{})r   r`   )formatctypesr   	addressofll
add_symbolr   )namer3   symbol_nameaddrinfos       r   injectz!_build_hashsecret.<locals>.inject  sa    ,33D99oc""$$
k4(((&kEEET


r   djbx33a_suffix
siphash_k0
siphash_k1)r   in_dllr   r   r   r   r   r   )pyhashsecretr   r   s     @r   _build_hashsecretr     s     $**96FGGLDF F F F F F\18999
F<-0111
F<-0111Kr   )	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.r6   bc                 f    t          j        | |z  | t          j        d          |z
  z	  z            S )Nrg   r   r   s     r   _ROTATEr     s1     |aQZQEL4D4D4J,KLMMMr   ar   cdstc                     | |z  } ||z  }t          ||          | z  }t          ||          |z  }t          | d          } | |||fS )Nr   )r   r   s         r   _HALF_ROUNDr     sU     	
Q	QAqMMAAqMMAArNN!Qzr   v0v1v2v3c                 r    t          | |||dd          \  } }}}t          ||| |dd          \  }}} }| |||fS )Nr   r         )r   r   s       r   _SINGLE_ROUNDr   $  sP    
 %RRR<<BB$RRR<<BB2r2~r   c                 j    t          | |||          \  } }}}t          | |||          \  } }}}| |||fS r   )r   r   s       r   _DOUBLE_ROUNDr   -  sH    
 'r2r266BB&r2r266BB2r2~r   c                 t   | 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
          fd	            }|S )
Nr   Tr   Fr   unreachable)
r   r   r   r   r   mir   maskjmpohexefefr=   c           	         t          j        |          dz  }| t          j        d          z  }|t          j        d          z  }| t          j        d          z  }|t          j        d          z  }d}	|dk    r=t          ||	          }
|	dz  }	|dz  }||
z  } ||||          \  }}}}||
z  }|dk    =t          j        d          }|	dz  }t          j        d	          }|d
k    rHd}t          j        ||z             }||z  t          j        t          ||dz                       |z  z  }|dk    rHd}t          j        ||z             }||z  t          j        t          ||dz                       |z  z  }|dk    rHd}t          j        ||z             }||z  t          j        t          ||dz                       |z  z  }|dk    rt|t          j        d          z  }t	          d          D ]M}|dz  }t          j        ||z             }||z  t          j        t          |||z                       |z  z  }N|dk    rHd}t          j        ||z             }||z  t          j        t          ||dz                       |z  z  }|dk    rHd}t          j        ||z             }||z  t          j        t          ||dz                       |z  z  }|dk    r.| }||z  t          j        t          ||dz                       z  }||z  }||z  } ||||          \  }}}}||z  }||z  } ||||          \  }}}} ||||          \  }}}}r ||||          \  }}}}||z  ||z  z  }|S )N8   l   ue`5{ l   mo\I{# l   ar\c l   ser+# r   r   r@         0      (      r   r   l        r   r      )r   r}   r   r   ri   )r   r   srcsrc_szr   r   r   r   r   rm   r   r   boffsetr   r   r   rl   _EXTRA_ROUND_ROUNDERs                    r   _siphashz_gen_siphash.<locals>._siphash@  s    V$$*Ael#5666Bel#5666Bel#5666Bel#5666BCQ;;"3,,q!b!)"b"b!9!9BBb Q;; S!!AAgG|D))H{{X_555X%,ygk/J/J"K"K%(#) *{{X_555X%,ygk/J/J"K"K%(#) *{{X_555X%,ygk/J/J"K"K%(#) *{{U\"4555q . .Aa%C!LS999DTel9S'A+3N3N&O&O),'- .AA{{X_555X%,ygk/J/J"K"K%(#) *{{X_555X%,ygk/J/J"K"K%(#) *{{!{X%,ygk/J/J"K"KLFA!GB%Xb"b"55NBB!GB(NB%Xb"b"55NBB%Xb"b"55NBB :!)"b"b!9!9BBbR"W%AHr   )r   r   r	   r   r}   )algr  r  r  s     @@r   _gen_siphashr  6  s    +$HLLK$H LL#m###	(-(-(-',|(-',|*/,)..3l	"< 	"< 	
= 	
= 	
=C	 C	 C	 C	 C		
= 	
=C	J r   r   r   z'Unsupported hashing algorithm in use %sc                     t          |t          j                  st          j        d          t
          |j                 j        t          j        } ||          }fd}||fS )z&Emit code to load the hashsecret.
    zrequires literal stringc                     |j         }	 |                              }n9# t          $ r, t          j        |t          j        d                    }Y nw xY w|                    |          }|S )Nrg   r   )module
get_globalKeyErrorr   GlobalVariableIntTypeload)rQ   rR   rX   rT   modgvrK   syms          r   r%   z%_inject_hashsecret_read.<locals>.impl  s}    n	B$$BB 	B 	B 	B"3
2SAAABBB	B LLs     3AA)	
isinstancer   StringLiteralr
   TypingError_hashsecretliteral_valuer   r}   )rW   r   restyrX   r%   r  s        @r   _inject_hashsecret_readr#    su     dE/00 < !:;;;
d(
)
0CLE
%++C	 	 	 	 	 9r   c                 &    t           |          j        S r   )r   r`   r  s    r   _load_hashsecretr%    s    t""r   c                     d }|S )Nc                      t          |           S r   )r#  r  s    r   impz"_impl_load_hashsecret.<locals>.imp  s    &t,,,r   r   )r   r(  s     r   _impl_load_hashsecretr)    s    - - -Jr   _hashc                    |dk    rt          d          S |t          k     rdt          d          }t          |          D ]-}|dz  |z   t	          j        t          | |                    z   }.||z  }|t          d          z  }n_t          t          j
        t          d                    t          j
        t          d                    | |          }t          |          }t          |          S )Nr   i  r  r   r   r   )r5   _Py_HASH_CUTOFFr   ri   rB   uint8r   r%  
_siphasherr   r}   )r3   _lenr*  rm   tmps        r   _Py_HashBytesr1    s    		a    D!!;; 	K 	KCqjE)RXiS6I6I-J-JJEE!"2333&6|&D&DEE&6|&D&DEEd$ $ s##%   r   c                     ddl m fd}|S )Nr   )_kind_to_byte_widthc                      | j                   }t          |           }| j        }|dk    r|S t          | j        ||z            S )Nr/   )_kindr   r*  r1  _data)r3   	kindwidthr/  current_hashr3  s       r   r%   zunicode_hash.<locals>.impl  sQ    ''	22	3xxy2 !I,<===r   )numba.cpython.unicoder3  )r3   r%   r3  s     @r   unicode_hashr:    s5    999999
> 
> 
> 
> 
> Kr   )u__doc__rI   numpyrB   rz   r   warningscollectionsr   llvmlite.bindingbindingr   llvmliter   numbar   numba.core.extendingr   r   r   r	   
numba.corer
   r   r   numba.core.unsafe.bytesr   r   numba.cpython.randomimplr   r   r   r   	PYVERSIONrF   	hash_infowidthr]   r+   r1   r   infrE   nanrH   modulusr;   intpr   r<   _PyHASH_MULTIPLIERr   int_infobits_per_digitre   cutoffr,  	algorithm_Py_hashfunc_namer   r&   r   r-   r5   doubleintcrL   rY   rG   int32rn   IntegerBooleanr~   Floatr   Complexr   r   r   r   r}   r   r   	BaseTupler   r   r   r   r   r   r   r   r   r   r   r   r   r   r   msgwarnr   r   r   r   r  
_siphash13
_siphash24r.  
ValueErrorr#  r%  r)  r1  UnicodeTyper:  r   r   r   <module>rb     s	         



   " " " " " "                        < < < < < < < < < < < <       # # # # # # # # < < < < < < < <5 5 5 5 5 5 5 5 5 5 5 5 /W, m!WUGk122
geX344 mm+cm344Z(B..rrB !+-&M+ 	 	 	 
+   
$      {*$|$z"'*-8*/*6 6 7 7 7. .7 7.b      > { + + + +-8*/++0;9 9 : : : : :: 
++
++& & ,+ ,+&X j))  *)" 
++  ,+( 1q  #$899#$899#$788c5<0111C C 21C C $J//#J//#I..c5<0111C C 21C
 k/:/: +- - . . . 	. .& *--  .-(                   )       i       i       I       u    J2Xw4GHH   6  !! 999
 E!!' 	c^ 5<#(<3 3 4 4 4N N4 4N 5<#(<#(<#(<#(<#(<3 3 4 4 4 4 4 EL$)L$)L$)L4 4 5 5 5 	5 5
 EL$)L$)L$)L4 4 5 5 5 	5 5
Y Y Yv k**Jk**J0K??ZJJ 46G
GC
*S//   0# # # 

   ';/000! ! 10!0 "J//  0/  r   