Сделай математику. 1 триллион MD5 без всяких уловок занял бы 16 ТБ дискового пространства. Я предполагаю, что это намного больше, чем размер вашей оперативной памяти.
Поскольку каждый поиск MD5 по сути является «случайным» исследованием диска, на каждую проверку обязательно будет попадать около 1 диска.
Если, скажем, чтение SSD составляет 1 мс, то есть 1e9 секунд, чтобы вставить (или проверить) триллион хэшей. Это 30 лет.
В моей математике много fl aws, но я думаю, что это говорит о том, что сегодня не практично хранить и проверять триллион всего случайного.
Если вы хотите сократить его до миллиарда MD5, сейчас мы получаем диапазон размеров ОЗУ. Но вы, вероятно, хотите, чтобы данные сохранялись? Так что вам действительно нужен какой-то инструмент, похожий на базу данных, который будет выполнять сохранение за вас, выполняя проверки исключительно в оперативной памяти (скорость процессора).
В любом случае, я бы рассмотрел написание кода, который разбивает MD5 на 2 или 3 чанка, затем используйте чанки как структуру каталогов. На нижнем уровне у вас есть набор значений переменной длины для последнего блока. Каждый, возможно, длиной 8 байт. Для этого потребуется линейный или двоичный поиск по группе чисел, которые в два раза меньше MD5. Экономия здесь помогает компенсировать различные накладные расходы в остальной части структуры, а также необходимость записи блоков на диск. Следовательно, я все еще ожидал бы, что потребуется около 16 ГБ оперативной памяти для размещения миллиарда MD5.
При таком подходе практически любой механизм базы данных уже настроен для выполнения большей части работы достаточно эффективно. Самый низкий уровень - это некоторый тип BLOB, содержащий несколько 8-байтовых блоков.
Еще один прием, который нужно использовать ... Давайте рассмотрим только первые 5 байтов MD5. В 5 байтах есть триллион различных значений. Если у вас есть только миллиард записей в вашем наборе данных, то проверка 5 байтов с вероятностью 99,9% правильно скажет: «md5 отсутствует в наборе данных» против менее чем 0,01% вероятности сказать, что «md5 может * 1020». * быть в наборе данных ". В первом случае вы получите быстрый ответ с 5 ГБ для миллиарда элементов. В последнем случае вам может потребоваться go на диск и быть медленнее. Тем не менее, среднее время лучше. Это помогает со скоростью проверки. (Но не учитывает скорость загрузки.)