
    J/Phj                        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          Z$ e#ed          Z%ej         j&        Z'ej         j(        Z) e%ej         j*                  Z+ej,        j-        dk    rdndZ.dZ/e/Z0ej1        j2        Z3ej         j4        Z5ej         j6        Z7d Z8 ee8          d             Z9 ee:          d             Z;ed             Z< ee%e%ej=        ej>        ej>        e%ej>        d          d             Z?ed             Z@ed             ZA ee%e%e%e%e%e%ejB        ejB        d          d             ZC eejD        d           eejE        d          d                         ZF eejG        d          d             ZH eejI        d          d             ZJe%j-        dz  d k    r> e%d!          ZK e%d"          ZL e%d#          ZM ed$ejN        i          d%             ZOn= e%d&          ZK e%d'          ZL e%d(          ZM ed$ejN        i          d)             ZO ee%e%e%e%e%d*          d+             ZP eejQ        d          d,             ZRdd-lmSZSmTZTmUZUmVZVmWZWmXZX  G d. d/eW          ZY G d0 d1eW          ZZ G d2 d3eW          Z[ G d4 d5eW          Z\ G d6 d7eX          Z] ed8d9d:g          Z^d; Z_ e_            Z`e7d<v re7d=k    rd>Za ejb        ea            eejN        ejN        d?          d@             Zc eejN        ejN        ejN        ejN        ejN        ejN        dA          dB             Zd eejN        ejN        ejN        ejN        dC          dD             Ze eejN        ejN        ejN        ejN        dC          dE             ZfdF Zg egdG          Zh egdH          Zie7dGk    rehneiZjndIe7z  Za ekea          edJ             ZldK Zm eem          dL             Zn edMe%i          dN             Zo eejp        d          dO             ZqdS )Pz&
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_ptrpy_int       =   iCB c                     d S N )	hash_funcs    Y/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/numba/cpython/new_hashing.py_defer_hashr   /   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>.impl7   s#    G$$$9;;r   r   )r!   r   r#   r"   s      @r   ol_defer_hashr$   3   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>.implG   s>    3
## 	1sGC$<$<===/000r   r   )r!   r#   r*   s     @r   hash_overloadr+   @   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_returnr3   O   s.    sOOERBLr   )xymesign_PyHASH_MODULUS_PyHASH_BITSlocalsc                 `   t          j        |           sFt          j        |           r| dk    rt          S t           S t	                      }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_prng_random_hashr3   mathfrexpr9   r:   r0   )vr4   r6   r7   r8   r5   s         r   _Py_HashDoublerH   _   s_    ;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argsr1   s        r   r#   z_fpext.<locals>.impl   s%    1g}}S"-//222r   )r   	c_float64	c_float32)tyctxr1   r#   sigs       r   _fpextrU      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   )rM   rN   rO   rP   	state_ptrbitsvalues          r   r#   z_prng_random_hash.<locals>.impl   sZ    !%*==	%% ""5'9==EE D%HHEr   )r/   )rS   r#   rT   s      r   rD   rD      s&      $ ,,C9r   )r4   p1p2p3p4r9   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-   )ra   r   c_uint32r:   ranger9   r/   )
r1   
_tmp_shift
mask_shiftir4   r_   idxr]   r^   r`   s
             r   
_long_implrj      s     m#J>#&&&:5J 
}	!A 	
A

&BQUB## ! !-/!"WG	U^SC-$77:EFFF 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        r.   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)absr9   r/   rj   r3   )r1   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   c_int64r)   c_uint64)r1   r#   rs   rt   ru   s     @@@r   int_hashrz      sv     +00BBbM- 344K $C599M5==u~D# # # # # # #8 Kr   c                 *    | j         dk    rd }nd }|S )Nrc   c                 $    t          |           }|S r   )rH   )r1   hasheds     r   r#   zfloat_hash.<locals>.impl  s    #C((FMr   c                 f    t          j        t          |                     }t          |          }|S r   )r@   float64rU   rH   )r1   
fpextendedr}   s      r   r#   zfloat_hash.<locals>.impl  s)    F3KK00J#J//FMr   )bitwidthr1   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_IMAGr3   )r1   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,,> r4   c                 `    | t          j        d          z  | t          j        d          z	  z  S )Nr   !   r   	np_uint64r4   s    r   _PyHASH_XXROTATEr   >  -     eob)))a5?23F3F.FGHr   l   yn< l   wJ igVc                 `    | t          j        d          z  | t          j        d          z	  z  S )N      r   r   s    r   r   r   G  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   r3   )tupr   r   r4   r   s        r   _tuple_hashr   M  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   )r1   s    r   r#   ztuple_hash.<locals>.implf  s    3r   r   r   s     r   
tuple_hashr   d  s         Kr   )c_size_tc_ubytery   	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   ry   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ctypesry   	addressofll
add_symbolr   )namer1   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.r4   bc                 f    t          j        | |z  | t          j        d          |z
  z	  z            S )Nrc   r   r   s     r   _ROTATEr     s>     
!"(;(;q(A B D E E 	Er   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   re   )r   r   srcsrc_szr   r   r   r   r   ri   r   r   boffsetr   r   r   rh   _EXTRA_ROUND_ROUNDERs                    r   _siphashz_gen_siphash.<locals>._siphash?  s    ''2-Aeo&8999Beo&8999Beo&8999Beo&8999BCQ;;"3,,q!b!)"b"b!9!9BBb Q;; $$AAgGt,,H{{C888X%/)C12M2M"N"N%(#) *{{C888X%/)C12M2M"N"N%(#) *{{C888X%/)C12M2M"N"N%(#) *{{U_%7888q N NAa%C!OHO<<<DT3!)D)DEELNAA{{C888X%/)C12M2M"N"N%(#) *{{C888X%/)C12M2M"N"N%(#) *{{!{X%/)C12M2M"N"NO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  5  s    +$HLLK$H LL#m###	(-(-(-',(-',*//)..3o	"? 	"? 	
@ 	
@ 	
@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 )Nrc   r   )module
get_globalKeyErrorr   GlobalVariableIntTypeload)rM   rN   rT   rP   modgvrG   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   )rS   r   restyrT   r#   r  s        @r   _inject_hashsecret_readr!    su     dE/00 < !:;;;
d(
)
0COE
%++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   )r3   _Py_HASH_CUTOFFr   re   r@   uint8r   r#  
_siphasherr   r   )r1   _lenr(  ri   tmps        r   _Py_HashBytesr/    s    		a    D!!;; 	K 	KCqjE)RXiS6I6I-J-JJEE!"2333)9,)G)GHH)9,)G)GHH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(  r/  _data)r1   	kindwidthr-  current_hashr1  s       r   r#   zunicode_hash.<locals>.impl  sQ    ''	22	3xxy2 !I,<===r   )numba.cpython.unicoder1  )r1   r#   r1  s     @r   unicode_hashr8    s5    999999
> 
> 
> 
> 
> Kr   )r__doc__rE   numpyr@   rv   r   warningscollectionsr   llvmlite.bindingbindingr   llvmliter   numbar   numba.core.extendingr   r   r   r	   
numba.corer
   r   numba.core.unsafe.bytesr   r   numba.cpython.randomimplr   r   r   r   	hash_infowidthrY   r)   r/   r   infrC   nan_PyHASH_NANmodulusr9   r   r   r:   _PyHASH_MULTIPLIERr   int_infobits_per_digitra   cutoffr*  	algorithm_Py_hashfunc_namer   r$   r   r+   r3   	np_doublenp_intcrH   rU   rD   c_int32rj   IntegerBooleanrz   Floatr   Complexr   r   r   r   r   r   r   	BaseTupler   r   r   ry   r   r   r   r   r   r   r   r   r   r   r  msgwarnr   r   r   r   r  
_siphash13
_siphash24r,  
ValueErrorr!  r#  r'  r/  UnicodeTyper8  r   r   r   <module>r_     s         



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