def __init__(self, hashSeed, keysDict, m, k, q, useTable=False):
        self.hashSeed = hashSeed
        self.keysDict = keysDict
        self.m = m
        self.k = k
        self.q = q
        self.hasher = BloomierHasher(hashSeed, m, k, q)
        self.byteSize = getByteSize(q)

        # oamf = OrderAndMatchFinder(hashSeed, keysDict, m, k, q)
        # oam =  oamf.find()

        ## TODO - this can be just bytearray
        self.table = [[0] * self.byteSize] * m
        self.valueTable = [0] * m
        self.slotEmpty = [0] * m  # originally all the slots are empty
    def __init__(self, hashSeed, keysDict, m, k, q, useTable=False):
        self.hashSeed = hashSeed
        self.keysDict = keysDict
        self.m = m
        self.k = k
        self.q = q
        self.hasher = BloomierHasher(hashSeed, m, k, q)
        self.byteSize = getByteSize(q)

        oamf = OrderAndMatchFinder(hashSeed, keysDict, m, k, q)
        oam = oamf.find()

        ## TODO - this can be just bytearray
        self.table = [[0] * self.byteSize] * m
        self.valueTable = [0] * m

        if useTable is False:
            self.create(keysDict, oam)