o
    3Ihk                     @   s   d dl mZmZmZ d dlZd dlZeeegef ZeZ	ee Z
eZdede
dededee	 f
dd	Zd
ededefddZde	dedefddZdS )    )CallableListTupleNkeymembershasherreplicationreturnc           
      C   s   |t |kr
tdt |dkrtdt |dkr|d gS | dkr'tdg }|D ]}|||  }t|||f q+g }t|D ]}t|}	||	d  qB|S )a]  Assigns a key to a member using the rendezvous hashing algorithm
    Args:
        key: The key to assign
        members: The list of members to assign the key to
        hasher: The hashing function to use
        replication: The number of members to assign the key to
    Returns:
        A list of members that the key has been assigned to
    z?Replication factor cannot be greater than the number of membersr   z%Cannot assign key to empty memberlist    zCannot assign empty key)len
ValueErrorheapqheappushrangeheappopappend)
r   r   r   r   member_score_heapmemberscoreoutput_members_member_and_score r   ^/home/air/sanwanet/gpt-api/venv/lib/python3.10/site-packages/chromadb/utils/rendezvous_hash.pyassign   s&   

r   xyc                 C   sH   | |A }||d? N }|d d }||d? N }|d d }||d? N }|S )zmurmurhash3 mix 64-bit!   l   Z_?z l            l   Sl5gu& r   )r   r   accr   r   r   merge_hashes3   s   r    r   c                 C   s.   t j| ddd }t j|ddd }t||S )z=Hashes the key and member using the murmur3 hashing algorithmF)signedr   )mmh3hash64r    )r   r   member_hashkey_hashr   r   r   murmur3hasher@   s   
r&   )typingr   r   r   r"   r   strintHasherMemberMembersKeyr   r    r&   r   r   r   r   <module>   s(   
'