You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何优化暴力破解算法以提升组合生成效率?

优化暴力破解程序的实用方案

嘿,我来帮你搞定这个暴力破解程序的速度问题——你现在用的三重嵌套循环写法,确实会随着字符长度增加指数级变慢(3位字符快8分钟,4位的话估计要十几个小时),完全没法应对更长的字符组合。下面是几个亲测有效的优化方向,一步步来:


1. 用itertools.product替代手动嵌套循环

Python内置的itertools.product是专门生成笛卡尔积的工具,底层用C实现,比你手动写的Python嵌套循环快得多。它能直接生成指定长度的所有字符组合,不用一层一层写for循环。

优化前代码(你的版本):

import time
start = time.time()
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' + 'abcdefghijklmnopqrstuvwxyz' + '1234567890'
for char1 in chars:
    for char2 in chars:
        for char3 in chars:
            print(char1 + char2 + char3)
end = time.time()
print(f"耗时: {end - start} 秒")

优化后(用itertools):

import time
import itertools

start = time.time()
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
# 生成3位字符的所有组合,repeat参数指定长度
for combo in itertools.product(chars, repeat=3):
    print(''.join(combo))
end = time.time()
print(f"耗时: {end - start} 秒")

这个改动至少能把速度提升2-3倍,而且字符长度越长,优势越明显(比如4位字符的话,差距会更大)。


2. 彻底砍掉不必要的I/O操作

你原来的代码每次循环都调用print,这是拖慢速度的头号杀手——I/O操作比CPU运算慢几个数量级。如果不需要实时打印,建议:

  • 把所有组合批量写入文件(比逐行打印快100+倍)
  • 如果必须要输出,尽量减少打印的频率,比如每生成1000个组合打印一次状态

优化后的文件写入版本:

import time
import itertools

start = time.time()
chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
# 打开文件,用w模式(如果要追加用a)
with open('combinations.txt', 'w', encoding='utf-8') as f:
    for combo in itertools.product(chars, repeat=3):
        f.write(''.join(combo) + '\n')
end = time.time()
print(f"耗时: {end - start} 秒")

这个版本的速度会比你原来的print版本快至少一个数量级。


3. 用多进程利用多核CPU

暴力破解是典型的CPU密集型任务,但Python的GIL(全局解释器锁)会限制多线程的效率,所以用多进程才能真正利用电脑的多核CPU。我们可以把字符集分成多个块,每个进程负责处理一块的组合生成。

多进程示例代码:

import time
import itertools
from multiprocessing import Pool

def generate_combinations(char_block):
    # 每个进程负责处理char_block中的字符作为第一个字符,生成后续组合
    chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
    results = []
    for char1 in char_block:
        for combo in itertools.product(chars, repeat=2):
            results.append(char1 + ''.join(combo))
    return results

if __name__ == '__main__':
    start = time.time()
    chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'
    # 把字符集分成4块(根据你的CPU核心数调整,比如8核就分8块)
    chunk_size = len(chars) // 4
    char_chunks = [chars[i:i+chunk_size] for i in range(0, len(chars), chunk_size)]
    
    # 创建进程池,进程数等于CPU核心数
    with Pool(processes=4) as pool:
        # 并行处理每个字符块
        all_results = pool.map(generate_combinations, char_chunks)
    
    # 把所有结果写入文件
    with open('combinations_multiprocess.txt', 'w', encoding='utf-8') as f:
        for chunk_results in all_results:
            f.write('\n'.join(chunk_results) + '\n')
    
    end = time.time()
    print(f"耗时: {end - start} 秒")

这个版本能让你的CPU利用率拉满,速度提升幅度等于你电脑的核心数(比如4核就能快3-4倍)。


4. 缩小字符集(最直接的优化)

如果你的目标有已知的字符范围(比如只包含小写字母+数字,或者大写字母),直接缩小chars的范围,能大幅减少总组合数:

  • 比如原来的字符集有62个字符,3位组合是62^3=238328个
  • 如果缩小到小写字母+数字(36个),3位组合只有36^3=46656个,直接减少80%的工作量

最后提醒

暴力破解未经授权的系统或数据是违法的,请确保你是在合法合规的场景下使用这些技术(比如测试自己的系统安全性)。

内容的提问来源于stack exchange,提问作者user6095769

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:04:33