diff --git a/extract/padelnomics_extract/src/padelnomics_extract/proxy.py b/extract/padelnomics_extract/src/padelnomics_extract/proxy.py index 0e8c82e..7a8b5f5 100644 --- a/extract/padelnomics_extract/src/padelnomics_extract/proxy.py +++ b/extract/padelnomics_extract/src/padelnomics_extract/proxy.py @@ -57,6 +57,27 @@ def make_round_robin_cycler(proxy_urls: list[str]): return next_proxy +def make_sticky_selector(proxy_urls: list[str]): + """Hash-based sticky proxy selector. + + Returns a callable: select_proxy(key: str) -> str | None + The same key always maps to the same proxy (consistent hashing). + Returns None-returning callable if no proxies configured. + """ + if not proxy_urls: + return lambda key: None + + n = len(proxy_urls) + + def select_proxy(key: str) -> str: + import hashlib + + idx = int(hashlib.md5(key.encode(), usedforsecurity=False).hexdigest(), 16) % n + return proxy_urls[idx] + + return select_proxy + + def make_tiered_cycler( primary_urls: list[str], fallback_urls: list[str],