o
    i                     @   s   d dl Z d dlZd dlZd dlZd dlmZm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 eeZe jddd	ed
eg df fddZG dd dZdS )    N)CallableIterable)Image)init_logger   )MediaWithBytes   )maxsize	algorithmreturnzhashlib._Hashc                 C   sJ   |   } | dkrddlm} |S | dkrtjS | dkrtjS td|  )aP  
    Get the hasher factory based on the configured algorithm.

    Args:
        algorithm: Hash algorithm name (blake3, sha256, or sha512)

    Returns a callable that creates a new hasher instance.
    Supports blake3 (default), sha256, and sha512 for FIPS compliance.

    See: https://github.com/vllm-project/vllm/issues/18334
    blake3r   )r   sha256sha512zUnsupported hash algorithm: )lowerr   hashlibr   r   
ValueError)r
   r    r   L/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/multimodal/hasher.py_get_hasher_factory   s   r   c                	   @   sb   e Zd ZededeeeB  fddZede	dedeeeB  fddZ
edede	fd	d
ZdS )MultiModalHasherobjr   c           	      C   s4  t |ttfr
|fS t |tr|dfS t |ttfr$t|	 fS t |t
j
rn| }t
jjj|v rIt |t
jjj tjrI|t
jjj jfS |jt|d}|j}|d urh|j|d< |jd urh|j|d< | d|S t |trt |jt
j
r|j }t
jjj|v rt |t
jjj tjr|t
jjj jfS | d|jS t |tjr| }|j}|j}|tjkr| }| |! f tj"}| dt|t#||$ dS | d|$ S t |tj%r|j&dkr|' }n|j(j)r| tj"j*}n|	 }| d	|jj|j|d
S t+,dt-| t./|fS )Nutf-8)modedatapalettepalette_rawmodeimagetensor)original_dtypeoriginal_shaper   r   ndarray)dtypeshaper   z=No serialization method found for %s. Falling back to pickle.)0
isinstancebytes
memoryviewstrencodeintfloatnparraytobytesr   getexifExifTagsBaseImageIDuuidUUIDr   asarrayr   rawmodeiter_item_to_bytesr   mediaoriginal_bytestorchTensorcpur!   r"   bfloat16
contiguousviewnumeluint8tuplenumpyr    ndimitemflagsc_contiguousr   loggerwarningtypepickledumps)	clsr   exifr   r   
tensor_objtensor_dtypetensor_shapearr_datar   r   r   serialize_item3   st   





	

	zMultiModalHasher.serialize_itemkeyc                 c   s    |d u r| dV  d S t|ttfr-t|D ]\}}| | d| |E d H  qd S t|trK| D ]\}}| | d| |E d H  q6d S | dV  | |E d H  d S )Nr   .)	r'   r#   listr@   	enumerater5   dictitemsrQ   )rK   rR   r   ielemkvr   r   r   r5      s   
z#MultiModalHasher.iter_item_to_byteskwargsc                 K   sR   t tj}| }t| dd dD ]\}}| ||D ]}|| qq| S )Nc                 S   s   | d S )Nr   r   )kvr   r   r   <lambda>   s    z.MultiModalHasher.hash_kwargs.<locals>.<lambda>)rR   )r   envsVLLM_MM_HASHER_ALGORITHMsortedrW   r5   update	hexdigest)rK   r\   hasher_factoryhasherrZ   r[   bytes_r   r   r   hash_kwargs   s   
zMultiModalHasher.hash_kwargsN)__name__
__module____qualname__classmethodobjectr   r$   r%   rQ   r&   r5   rg   r   r   r   r   r   2   s    Q
r   )	functoolsr   rI   r1   collections.abcr   r   rA   r*   r8   PILr   	vllm.envsr_   vllm.loggerr   r6   r   rh   rF   	lru_cacher&   r   r   r   r   r   r   <module>   s   
