Мне нужно найти хэши 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()