"""Детерминированная случайность: одно зерно на каждую подсистему. Любая случайность в генераторе — только через `rng_for(seed, *keys)`; модульный `random` запрещён. Ключи должны иметь стабильный `repr` (строки, числа, даты, кортежи из них). """ import hashlib import random def rng_for(seed: int, *keys: object) -> random.Random: """Генератор, зерно = первые 8 байт SHA-256 от repr((seed, *keys)) (порядок байт — big-endian).""" digest = hashlib.sha256(repr((seed, *keys)).encode("utf-8")).digest() return random.Random(int.from_bytes(digest[:8], "big")) def stable_hash(text: str, modulo: int) -> int: """Стабильный хеш строки (SHA-256 → целое → остаток); в отличие от hash() не зависит от PYTHONHASHSEED.""" return int.from_bytes(hashlib.sha256(text.encode("utf-8")).digest(), "big") % modulo