1、介绍
进制算法。
2、代码
"""
进制算法,返回一个list,有两大类型
1、单个集合
从长度为m的单个集合中,一次性选择n个元素,各自索引按序组成list,作为结果list的元素。
(1)先按进制计算遍历,获取所有可能的组合
(2)标志1,如果为True,表示允许一次选择中,禁止重复选择某一索引
(3)标志2,如果为True,表示一次选择的过程中,后选择的索引必须大于等于上一次选择的。
标志1为True,且标志2为False,结果就是集合的排序
标志1位True,且标志2位True,结果就是集合的组合
2、多个集合
从长度分别为m1,m2...mn的多个集合中,一次性分别从各个集合中选择一个元素,各自被选择元素的索引按序组成list,作为结果list的元素
标志,决定是左侧低位,还是右侧低位。
- 对于一般的爆破而言,是设置左侧低位
- 但是对于ip+端口+路径爆破,或者用户名+密码爆破,则可能是左侧低位,也可能设置右侧低位,需要看实际需求
"""
"""
单个集合的场景
@list_len int类型,表示单列集合的长度
@count int类型,最小为1,表示一次从集合中选择的元素个数
@flag1 bool类型,为True表示禁止在一次选择中元素索引重复。为False则不处理
@flag2 bool类型,为True表示在一次选择过程中,先选择索引小的,后选择索引相等或者更大的。为False则不处理
@low_in_left_flag bool类型,为True表示左侧是低位,为False表示右侧是低位
"""
def radix_by_singular_list(list_len: int, count: int, flag1: bool, flag2: bool, low_in_left_flag: bool = True):
# 返回结果 list[list[int]]类型
result = list()
# 进制计算
radix_list = list()
for i in range(count):
radix_list.append(list_len)
radix_result = radix(radix_list=radix_list, low_in_left_flag=low_in_left_flag)
# 根据标志,进行筛选
for i in range(len(radix_result)):
for j in range(count):
# 当flag1为True表示禁止元素重复
if flag1 and radix_result[i][j] in radix_result[i][j + 1:]:
break
# 当flag2为True表示选择的后一个索引必须大于或等于前一个
if flag2 and j != count-1 and radix_result[i][j] > radix_result[i][j + 1]:
break
# 符合条件,写入返回结果
else:
result.append(radix_result[i])
return result
"""
复数集合的场景,实际等价于直接的radix函数
@list_len_list list[int]类型,表示各集合的长度
@low_in_left_flag bool类型,为True表示左侧是低位,为False表示右侧是低位
"""
def radix_by_plural_list(list_len_list: list, low_in_left_flag: bool):
return radix(radix_list=list_len_list, low_in_left_flag=low_in_left_flag)
"""
进制算法
@radix_list list[int]类型,元素是各位上的进位数,最小为1
@low_in_left_flag bool类型,为True表示左侧是低位,为False表示右侧是低位
"""
def radix(radix_list: list, low_in_left_flag: bool):
# 返回结果 list[list[int]]类型
result = list()
# 作为递增1的临时量,各位初始为0
temp = list()
for i in range(len(radix_list)):
temp.append(0)
while True:
result.append(temp)
temp = temp.copy()
# 左侧是低位
if low_in_left_flag:
# 低位增1
temp[0] = temp[0] + 1
# 检查溢出到次高位
for i in range(len(radix_list) - 1):
if temp[i] == radix_list[i]:
temp[i + 1] = temp[i + 1] + 1
temp[i] = 0
else:
break
# 检查到次高位,仍然是溢出,则检查最高位是否溢出
else:
if temp[-1] == radix_list[-1]:
break
# 右侧是低位
else:
# 低位增1
temp[-1] = temp[-1] + 1
# 检查溢出到次高位
for i in range(1, len(radix_list)):
if temp[-i] == radix_list[-i]:
temp[-i - 1] = temp[-i - 1] + 1
temp[-i] = 0
else:
break
# 检查到次高位,仍然是溢出,则检查最高位是否溢出
else:
if temp[0] == radix_list[0]:
break
return result
标签:RadixModule,radix,temp,list,api,result,True,low
From: https://www.cnblogs.com/wd404/p/17432956.html