import numpy import hashlib from numpy.typing import NDArray def pseudo_random_generator( seed: bytes, length: int ) -> NDArray[numpy.float64]: if length < 0: raise ValueError("Length invalid. Must be > 0") output: NDArray[numpy.float64] = numpy.empty(length, dtype=numpy.float64) counter: int = 0 index: int = 0 while index < length: digest: bytes = hashlib.sha256(seed + counter.to_bytes(4, "big")).digest() for j in range(0, 32, 8): if index >= length: break chunk: bytes = digest[j: j + 8] value_u64: int = int.from_bytes(chunk, "big") output[index] = (value_u64 / (2 ** 64)) - 0.5 index += 1 counter += 1 return output def derive_pair_seed( client_secret: bytes, identifier_a: str, identifier_b: str ) -> bytes: low, high = sorted([identifier_a, identifier_b]) material: bytes = client_secret + b"|pair|" + low.encode() + b"|" + high.encode() return hashlib.sha256(material).digest()