From c4fc6eca6d76b60b5c20735562f3aa1c4d1a250a Mon Sep 17 00:00:00 2001 From: Nityahiray Date: Thu, 19 Mar 2026 10:37:50 +0530 Subject: [PATCH] fix: replace hash() with hashlib.md5 for stable seeding and add docstrings to mask classes. --- csa/_elementary.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/csa/_elementary.py b/csa/_elementary.py index fdb22a6..faf3eda 100644 --- a/csa/_elementary.py +++ b/csa/_elementary.py @@ -19,6 +19,7 @@ import random import numpy import copy +import hashlib from . import connset as cs from . import intervalset as iset @@ -56,7 +57,7 @@ def iterator (self, low0, high0, low1, high1, state): class ConstantRandomMask (cs.Mask): tag = 'randomMask' - def __init__ (self, p): + def __init__ (self, p:float, seed: int = None): cs.Mask.__init__ (self) self.p = p self.state = random.getstate () @@ -151,6 +152,7 @@ def startIteration (self, state): obj.perTarget = numpy.random.multinomial (obj.N, [1.0 / N1] * N1) return obj +class BaseRandomMask(cs.Mask): def iterator (self, low0, high0, low1, high1, state): m = self.mask.set1.count (0, low1) @@ -243,7 +245,7 @@ def startIteration (self, state): else: seed = 'FanInRandomMask' # Numpy.random.seed requires an unsigned 32 bit integer - numpy.random.seed (hash (seed) % (numpy.iinfo(numpy.uint32).max + 1)) + numpy.random.seed (int(hashlib.md5(seed.encode()).hexdigest(), 16) % (numpy.iinfo(numpy.uint32.max + 1))) selected = state['selected'] obj.mask = partitions[selected]