Как обрабатывать переменную dict с 2^50 элементами?

Мне нужно найти хэши SHA256 из 2^25 случайных строк. А затем ищите коллизию (, используя парадокс дня рождения только для последних, скажем, 50 бит хеша).

Я сохраняю пару строк:хэш в переменной dict. Затем сортируем переменную со значениями (не ключами), а затем ищем коллизию, используя цикл O(n).

Проблема в том, что, поскольку имеется 2^25 строк и их 2^25 хэшей, переменная dict содержит 2^50 значений. Это ОЧЕНЬ ресурсоемко. Итак, как мне это сделать с ограниченной оперативной памятью, скажем, около 1 ГБ?

Что я уже пробовал:
1. Запуск с пространством подкачки 6 ГБ. Программа работала всю ночь и все еще не была завершена. По сути, это даже медленнее, чем поиск O(n_square)! Хеши рассчитаны с использованием оперативной памяти около 3,2 ГБ. Но после этого, когда дело доходит до команды сортировки, используемая оперативная память снова начинает расти! Хотя сортировка Python использует In-Place-Quicksort:(
2. Я сохранил только хэши и обнаружил коллизию. Но не смог найти соответствующую строку, т.к. не сохранил ее.

Я не должен использовать базы данных и т. д. В лучшем случае текстовый файл, но это не помогает. Кроме того, я новичок в Python, но не позволяйте этому ограничивать уровень вашего ответа.

PS:это задание. Некоторые утверждают, что обнаружили коллизии менее чем за одну минуту с 300 МБ ОЗУ. Не знаю, правда ли это. Я решил проблему, но ответ недоступен! На работе сейчас нет доступа к коду. Добавлю скоро.

Код:

from Crypto.Hash import SHA256
import os
import random
import string
from operator import itemgetter

def shaa():

    trun=[]
    clist={}
    for i in range(0,33554432):

        sha=SHA256.new(str(i)).hexdigest()
        sha=int(bin(int(sha,16))[-50:],2)
        clist[i]=sha

    print 'Hashes done.'

    clist=sorted(clist.items(), key=itemgetter(1))  
    for i in range(0,33554432):

        if(clist[i]==clist[i+1]):
            #print string[i],string[i+1]
            print clist[i]
            return 1
    return 2

result=2
while(result==2):
    result=shaa()
8
задан smci 7 October 2019 в 23:55
поделиться