我必须找到 2^25 个随机字符串的 SHA256 哈希。然后寻找冲突(对最后一个使用生日悖论,例如,仅 50 位散列)。
我将字符串:哈希对存储在 dict 变量中。然后使用值(不是键)对变量进行排序,然后使用 O(n) 循环查找冲突。
问题是因为有 2^25 个字符串和它们的 2^25 个哈希,所以 dict 变量中有 2^50 个值。这是非常耗费资源的。那么,我该如何在有限的 RAM(比如 1GB 左右)的情况下做到这一点?
我已经尝试过:
1. 使用 6GB 交换空间运行它。该程序运行了一夜,仍然没有完成。这基本上比 O(n_square) 搜索还要慢!哈希值是使用大约 3.2 GB 的 RAM 使用量计算的。但在那之后,当涉及到 sort 命令时,使用的 RAM 又开始猛增!我虽然 python 排序使用 In-Place-Quicksort :(
2。我只存储了哈希值并发现了一个冲突。但由于没有存储它而找不到相应的字符串。
我不应该使用数据库等。最多是一个文本文件,但这无济于事。另外,我对 Python 还是很陌生,但不要让这限制了你的答案水平。
PS:这是一个任务。一些人声称在 300MB RAM 的情况下不到一分钟就发现了冲突。不知道这是不是真的。我已经解决了这个问题,但答案是无法得到的!在工作中,所以现在无法访问代码。将很快添加。
代码:
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()