o
    wvXjñ  ã                   @   s"   d dl Z d dlZG dd„ dƒZdS )é    Nc                   @   sJ   e Zd Zg Zddd„Zdd„ Zdd„ Zd	d
„ Zdd„ Zdd„ Z	dd„ Z
dS )ÚHashRing© é€   c                 C   s*   || _ i | _g | _|D ]}|  |¡ qd S ©N)ÚreplicasÚringÚsorted_keysÚadd_node)ÚselfÚnodesr   Únoder   r   úS/var/www/html/myproject/venv/lib/python3.10/site-packages/django_redis/hash_ring.pyÚ__init__   s   ÿzHashRing.__init__c                 C   s^   | j  |¡ t| jƒD ]}d ||¡}t | ¡ ¡ ¡ }|| j	|< | j
 |¡ q| j
 ¡  d S )Nz{}:{})r   ÚappendÚranger   ÚformatÚhashlibÚsha256ÚencodeÚ	hexdigestr   r   Úsort)r
   r   ÚxÚ_keyÚ_hashr   r   r   r	      s   
zHashRing.add_nodec                 C   sN   | j  |¡ t| jƒD ]}t d||f ¡ ¡ }| j |¡ | j |¡ qd S )Nz%s:%d)	r   Úremover   r   r   r   r   r   r   )r
   r   r   r   r   r   r   Úremove_node   s   ýzHashRing.remove_nodec                 C   s   |   |¡\}}|S r   )Úget_node_pos)r
   ÚkeyÚ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   sL   � t | jƒdkrdV  |  |¡\}}| j|d … D ]
}|| j| fV  qd S )Nr   r!   )r#   r   r   r   )r
   r   r   ÚposÚkr   r   r   Ú
iter_nodes0   s   €ÿzHashRing.iter_nodesc                 C   s
   |   |¡S r   )r    )r
   r   r   r   r   Ú__call__8   s   
zHashRing.__call__N)r   r   )Ú__name__Ú
__module__Ú__qualname__r   r   r	   r   r    r   r)   r*   r   r   r   r   r      s    
	r   )r$   r   r   r   r   r   r   Ú<module>   s    