Python 生成任意长度密码

需求:

获取多个长度的密码,密码可能是数字,大小写字母,其他特殊符号

总体思路:

1、为了方便密码集通过ASCII码对应的数字来获取,将需要的密码类型的字符通过其在ASCII表中的位置,使用chr()方法来获取字符,这样便于一次性生成。

2、因为密码长度不是固定的,因此不能采用直接嵌套for循环的方式来获取密码,我们可以根据密码的长度,定义一个列表,将每一位次的密码集保存在这个列表中,获取当前位次密码,就是从这个列表的对应序号的密码集中获取值,获取不同的密码,就是不断的获取每一位次密码的下一位,直到第一位密码集被全部获取为止

3、通常我们获取密码,都是最后一位不断+1,当最后一位达到最大值时,他的前一位+1,他自己回到最小值,而当第一位密码达到最大值,并且他又需要+1时,说明我们的密码获取完了,这里我用了pop()函数,当需要+1时,我们就把当前位次的值取出来,并且删掉,当第一位的密码集为空时,我们就应该结束这一长度的密码获取了

4、其实就算是四位长度的密码,包含数字和字母,他的数据量也是很大的了,把他写入文件中就有八十多兆,而且也是需要一定的时间的。因此,当你是要直接利用密码时,可以用yield生成迭代器,用迭代器.__next__()获取密码。但是他不能用于多进程,你不可以把迭代器作为参数传给子进程,但是你可以将密码分段获取,生成子进程时,只传入密码分段规则(如密码长度?类型?),在进程中再根据传入的规则生成密码。

# coding: utf-8

"""

@author	微&风

@date	2019.11.05

"""
def get_pwds(pmin, pmax):
 	digit = [chr(d) for d in range(48, 58)] # 数字
    lower = [chr(l) for l in range(97, 123)] # 小写字母
    upper = [chr(u) for u in range(65, 91)] # 大写字母
    others = [chr(o) for o in list(range(33,48)) + list(range(58, 65)) + list(range(91, 97))]
	
	# 本次密码获取用到的字符集
    my_pwds = digit + lower + upper
	# 防止用户最大最小位次输入错误,导致出现问题
    if pmin > pmax: pmin, pmax = pmax, pmin

    for leng in range(pmin, pmax+1):
        print(leng)
        # 按密码长度保存,按自己喜好了
        F = open('./Pwds/pwds{}.txt'.format(leng), 'w') 

        leng_pwds = [] # 对应密码长度的密码集
        adds = [] # 存储判断这一位次密码是否要变化
        leng_current = [] # 记录各位次访问到第几个值了

        for i in range(leng):
            # 获取包含特定长度的密码集,
            # 重点重点重点!!!必须copy,否则下面j==0时的pop会直接操作my_pwds,
            # 导致每一位的密码集长度都减少了。 
            leng_pwds.append(my_pwds.copy()) 

            adds.append(False) # False表示该位次密码不需要改变,即下一位次的密码还没有访问完
            leng_current.append(0) # 开始时都是
        
        # 当第一个密码集为空时,说明当前长度的密码已经遍历完毕,应该获取下一长度的密码
        while leng_pwds[0]: 
             pwd = '' # 存储密码
             # 只有一位直接取出来
          	if leng == 1: pwd += leng_pwds[0].pop(0)
          		
			else:
	            for j in range(leng): # 获取leng长度密码的第j位密码
	                if j == 0:
	                    if adds[0] is True:
	                        adds[0] = False
	                         # 从对应密码集中取出对应位次密码密码,减少首位密码的长度,
	                        pwd += leng_pwds[0].pop(0)
	                    else: pwd += leng_pwds[0][0]  # 与pop序号对应
	
	                else: 
	                	# 其他位次需要不断重复,不能将其中的元素减少
	                    # 接到+1信号说明下一次就需要+1了,所以应该放在开头位置
	                    if adds[j] is True: # 当前序号需要+1时,将当前序号+1,并且将True改成False
	                        adds[j] = False
	                        leng_current[j] += 1  # 当前位次+1
	
	                    pwd += leng_pwds[j][leng_current[j]] # 获取当前位次元素
						# 判断当前位次元素是否遍历完成,完成说明上一位次需要+1,当前位次需要归0
	                    if leng_current[j] == len(leng_pwds[j])-1:  
	                        adds[j - 1] = True  
	                        leng_current[j] = 0
	
	                    elif j == leng - 1:
	                        leng_current[j] += 1  # 最后一位总是+1

           # yield pwd
           F.write(pwd + '\n')

if __name__ == '__main__':
	get_pwds(4, 4)
	

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值