Общая конструкция - хранить все 128-битные значения в большом массиве, отсортированном в порядке возрастания.Затем каждое значение «сопоставляется» с его индексом в массиве.Чтобы «вычислить» карту, вы выполняете двоичный поиск в массиве, чтобы получить точный индекс значения в массиве.Со значениями 2 32 размер массива составляет 64 ГБ, а двоичный поиск влечет за собой 35 или около того поисков в массиве.
Вообще говоря, вы не можете сделать действительно лучше, чем это.Однако, если ваши 128-битные значения имеют достаточно равномерный разброс (это зависит от того, откуда они поступают), тогда структура большого массива может быть сжата с большим запасом, особенно если вы можете гарантировать, что все входные данные для вашей карты всегда будут частьюиз набора 128-битных значений;Бьюсь об заклад, вы можете сократить его до пары гигабайт - но поиск будет стоить дороже.
Для более практичного решения вам придется работать со структурой из ваших 128-битных значений: откуда они берутся, что они представляют ...