Source code for titan_pylib.data_structures.safe_hash.hash_defaultdict
1from collections import defaultdict
2from random import Random
3from typing import Final
4
5
[docs]
6class HashDefaultdict:
7
8 _r = Random()
9 _xor: Final[int] = _r.randrange(10000000, 1000000000)
10
11 def __init__(self, missing):
12 self._data = defaultdict(missing)
13
14 def __iter__(self):
15 for k, v in self.items():
16 yield k, v
17
18 def __setitem__(self, key: int, value):
19 self._data[key ^ self._xor] = value
20
21 def __getitem__(self, key: int):
22 return self._data[key ^ self._xor]
23
24 def __delitem__(self, key: int):
25 del self._data[key ^ self._xor]
26
27 def __contains__(self, item):
28 return item ^ self._xor in self._data
29
30 def __len__(self):
31 return len(self._data)
32
[docs]
33 def keys(self):
34 return (k ^ self._xor for k in self._data.keys())
35
[docs]
36 def values(self):
37 return (v for v in self._data.values())
38
[docs]
39 def items(self):
40 return ((k ^ self._xor, v) for k, v in self._data.items())
41
42 def __str__(self):
43 return (
44 f"{self.__class__.__name__}("
45 + "{"
46 + ", ".join(f"{k}: {v}" for k, v in self.items())
47 + "})"
48 )
49
50 def __repr__(self):
51 return f"{self.__class__.__name__}({self})"