多次散列相同的字符

时间:2013-05-06 13:01:40

标签: python string algorithm hash md5

我正在进行编程挑战,而且我对其中一个挑战感到疯狂。在挑战中,我需要计算字符串的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的任何属性吗?

我知道必须有一个表格可以在短时间内完成,我怀疑它必须与所有字符串具有重复多次相同字符的事实有关。

3 个答案:

答案 0 :(得分:3)

您可能已创建(递归)函数以将结果生成为单个值。相反,您应该使用生成器将结果生成为字节流。然后,您可以逐字节地将这些内容提供给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

答案 1 :(得分:0)

所有散列函数都设计用于字节流,因此您不应该首先生成整个字符串,并且在该散列之后 - 您应该编写生成器,生成字符串数据块,并将其提供给MD5上下文。 并且,MD5使用64字节(或字符)缓冲区,因此最好将64字节数据块提供给上下文。

答案 2 :(得分:0)

利用哈希的优良特性:

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个字符长)为一个接一个地提供算法。

相关问题