如何管理python的内存?

问题描述 投票:0回答:1

我用python3创建了一个蛮力程序,但过程中总是出现MemoryError。一开始用户必须输入一个哈希算法(所有可能的算法都给定了),然后用户必须选择一个字符模式,并给出最小和最大可能的密码长度。然后代码使用所选的chars模式,尝试任何可能的组合,用所选算法进行哈希,并将哈希值与用户给出的哈希值进行比较。如果它们相同,代码就会给出使用该模式组合的密码。问题是,我的代码在执行密码长度为5时崩溃。

错误代码。

Traceback (most recent call last):
  File "C:/Users/ashka/PycharmProjects/bruteforce/main.py", line 122, in <module>
    main()
  File "C:/Users/ashka/PycharmProjects/bruteforce/main.py", line 116, in main
    bruteforce(min, max, hash, hashfunction)
  File "C:/Users/ashka/PycharmProjects/bruteforce/main.py", line 91, in bruteforce
    if bf_sha512(_, hash) is not None:
  File "C:/Users/ashka/PycharmProjects/bruteforce/main.py", line 23, in bf_sha512
    passwords = [functools.reduce(operator.add, (p)) for p in itertools.product(chars, repeat=n)]
  File "C:/Users/ashka/PycharmProjects/bruteforce/main.py", line 23, in <listcomp>
    passwords = [functools.reduce(operator.add, (p)) for p in itertools.product(chars, repeat=n)]
MemoryError

Process finished with exit code 1

错误代码: 错误出现的代码区。

def bf_sha512(n, hash, chars):
    print(' ')
    print('Testing all possible passwords with ' + str(n) + ' characters... [' + str(int(chars.__len__())**n) + ']')
    time.sleep(1)
    with tqdm(total=int(chars.__len__())**n) as pbar:
        count = 0
        for password in [functools.reduce(operator.add, p) for p in itertools.product(chars, repeat=n)]:
            count += 1
            pbar.update(1)
            if hashlib.sha512(password.encode()).hexdigest() == hash:
                print('Needed attempts: ' + str(count))
                print(' ')
                print("Hash: " + hash)
                print("Passwort: " + password)
                pbar.close()
                return password
        pbar.close()
        return None

我甚至尝试去掉所有的装饰性线条,比如进度条和计数,但它还是崩溃了。

python memory memory-management list-comprehension brute-force
1个回答
1
投票

导致该错误的问题是,通过使用以下方法将一个非常节省内存的生成器(每次只产生一个结果的代码,直到它完成运行)转换为一个列表 [] 左右 functools.reduce(operator.add, p) for p in itertools.product(chars, repeat=n).

通过将其转换为一个列表,你使生成器将其所有的值输出到一个列表中,在32位机器上,这个列表不能包含超过536,870,912个项目,当列表超过这个值时,你会得到内存错误。

解决方法:删除 []

© www.soinside.com 2019 - 2024. All rights reserved.