散列相同的字符多次

我正在做一个编程挑战,我要面对其中一项挑战而疯狂。 在挑战中,我需要计算一个字符串的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

上一篇: Hashing same character multiple times

下一篇: Upload image through form post