in samtranslator/utils/py27hash_fix.py [0:0]
def _get_key_idx(self, k): # type: ignore[no-untyped-def]
"""Gets insert location for k"""
# Py27UniStr caches the hash to improve performance so use its method instead of always computing the hash
h = k._get_py27_hash() if isinstance(k, Py27UniStr) else ctypes.c_size_t(Hash.hash(k)).value
i = h & self.mask
if i not in self.keyorder or self.keyorder[i] == k:
# empty slot or keys match
return i
freeslot = None
if i in self.keyorder and self.keyorder[i] is self.DUMMY:
# dummy slot
freeslot = i
walker = i
perturb = h
while i in self.keyorder and self.keyorder[i] != k:
walker = (walker << 2) + walker + perturb + 1
i = walker & self.mask
if i not in self.keyorder:
return i if freeslot is None else freeslot
if self.keyorder[i] == k:
return i
if freeslot is None and self.keyorder[i] is self.DUMMY:
freeslot = i
perturb >>= PERTURB_SHIFT
return i