a
    Šxd!  ã                   @   sB   d dl Z d dlZd dlmZmZmZmZmZmZ G dd„ dƒZ	dS )é    N)ÚDictÚIterableÚIteratorÚListÚOptionalÚTuplec                   @   s´   e Zd Zg Zdee eddœdd„Zeddœdd	„Zeddœd
d„Z	ee
e dœdd„Zeee
e e
e f dœdd„Zeeee
e e
e f  dœdd„Zee
e dœdd„ZdS )ÚHashRing© é€   N)ÚnodesÚreplicasÚreturnc                 C   s*   || _ i | _g | _|D ]}|  |¡ qd S ©N)r   ÚringÚsorted_keysÚadd_node)Úselfr   r   Únoder	   r	   úN/var/www/html/Ranjet/env/lib/python3.9/site-packages/django_redis/hash_ring.pyÚ__init__	   s
    zHashRing.__init__)r   r   c                 C   s`   | j  |¡ t| jƒD ]:}|› d|› }t | ¡ ¡ ¡ }|| j|< | j	 |¡ q| j	 
¡  d S ©Nú:)r   ÚappendÚranger   ÚhashlibÚsha256ÚencodeÚ	hexdigestr   r   Úsort)r   r   ÚxÚ_keyÚ_hashr	   r	   r   r      s    
zHashRing.add_nodec                 C   sP   | j  |¡ t| jƒD ]4}t |› d|›  ¡ ¡ ¡ }| j|= | j	 |¡ qd S r   )
r   Úremover   r   r   r   r   r   r   r   )r   r   r   r!   r	   r	   r   Úremove_node   s
    zHashRing.remove_node)Úkeyr   c                 C   s   |   |¡\}}|S r   )Úget_node_pos)r   r$   ÚnÚir	   r	   r   Úget_node$   s    zHashRing.get_nodec                 C   sd   t | jƒdkrdS t | ¡ ¡ ¡ }t | j|¡}t|d | j	t | j
ƒ d ƒ}| j| j|  |fS )Nr   ©NNé   )Úlenr   r   r   r   r   Úbisectr   Úminr   r   )r   r$   r!   Úidxr	   r	   r   r%   (   s    zHashRing.get_node_posc                 c   sJ   t | jƒdkrdV  |  |¡\}}| j|d … D ]}|| j| fV  q0d S )Nr   r)   )r+   r   r%   r   )r   r$   r   ÚposÚkr	   r	   r   Ú
iter_nodes1   s
    zHashRing.iter_nodesc                 C   s
   |   |¡S r   )r(   )r   r$   r	   r	   r   Ú__call__9   s    zHashRing.__call__)r	   r
   )Ú__name__Ú
__module__Ú__qualname__r   r   ÚstrÚintr   r   r#   r   r(   r   r%   r   r1   r2   r	   r	   r	   r   r      s    	$r   )
r,   r   Útypingr   r   r   r   r   r   r   r	   r	   r	   r   Ú<module>   s    