散列相同的字符多次
我正在做一个编程挑战,我要面对其中一项挑战而疯狂。 在挑战中,我需要计算一个字符串的MD5。 该字符串以下面的形式给出:
n[c]
:其中n
是一个数字, c
是一个字符。 例如: b3[a2[c]]
=> baccaccacc
一切都很顺利,直到我得到以下字符串:
1[2[3[4[5[6[7[8[9[10[11[12[13[a]]]]]]]]]]]]]
这个字符串变成了一个6227020800 a
的字符串。 这个字符串大于6GB,因此在实际时间内计算几乎是不可能的。 所以,这是我的问题:
我可以在这里使用MD5的任何属性吗?
我知道在短时间内必须有一种形式,我猜想它必须与所有字符串具有相同字符重复多次的事实相关。
您可能已经创建了一个(递归)函数来将结果生成为单个值。 相反,你应该使用一个生成器来产生一个字节流的结果。 然后,您可以逐字节地将数据提供给您的MD5哈希例程。 流的大小并不重要,它只会影响计算时间,而不会影响使用的内存。
以下是使用单通解析器的示例:
import re, sys, md5
def p(s, pos, callBack):
while pos < len(s):
m = re.match(r'(d+)[', s[pos:])
if m: # repetition?
number = m.group(1)
for i in range(int(number)):
endPos = p(s, pos+len(number)+1, callBack)
pos = endPos
elif s[pos] == ']':
return pos + 1
else:
callBack(s[pos])
pos += 1
return pos + 1
digest = md5.new()
def feed(s):
digest.update(s)
sys.stdout.write(s)
sys.stdout.flush()
end = p(sys.argv[1], 0, feed)
print
print "MD5:", digest.hexdigest()
print "finished parsing input at pos", end
所有散列函数都设计为与字节流一起工作,所以您不应该首先生成整个字符串,然后在散列之后 - 您应该编写生成器,生成大量的字符串数据,并将其提供给MD5上下文。 而且,MD5使用64字节(或字符)缓冲区,因此向上下文提供64字节的数据块是一个好主意。
利用哈希的优良特性:
import hashlib
cruncher = hashlib.md5()
chunk = 'a' * 100
for i in xrange(100000):
cruncher.update(chunk)
print cruncher.hexdigest()
调整轮数(x = 10000)和块的长度(y = 100),使x * y = 13 !. 重点在于你正在用一串一串的字符串(每一个x个字符长度)一次接一个地执行y次。
链接地址: http://www.djcxy.com/p/13147.html