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

如何实现密码强度校验中的键盘连续字符阶梯扣分逻辑?

完善密码强度校验器的键盘连续序列扣分逻辑

我来帮你搞定这个键盘连续组合的扣分逻辑!根据你的需求,我们需要不区分大小写检测密码中匹配键盘连续序列的片段,并且按照连续长度递增扣分(越长扣越多),还要避免重复扣分同一段内容。

核心思路拆解

  1. 统一大小写:先把输入密码转为小写,解决大小写不敏感的问题。
  2. 生成键盘连续子串库:从给定的键盘顺序列表中,生成所有长度≥2的连续子串,并且按长度从长到短排序——这样可以优先匹配长片段,避免短片段重复扣分(比如"qwerty"不会被拆成"qwe"+"wer"+...多次扣分)。
  3. 匹配与扣分:遍历密码的所有可能子串,匹配键盘连续子串,根据长度扣除对应分数,同时标记已匹配的位置防止重复计算。

完整代码实现

def deduct_keyboard_pattern_score(password, score):
    keyboard_pattern = ['q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 
                        'a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', 
                        'z', 'x', 'c', 'v', 'b', 'n', 'm']
    # 把键盘列表转为字符串,方便生成连续子串
    keyboard_str = ''.join(keyboard_pattern)
    password_lower = password.lower()
    used_indices = set()  # 记录已扣分的字符位置,避免重复计算

    # 生成所有长度≥2的键盘连续子串,按长度从长到短排序
    keyboard_substrings = []
    max_length = len(keyboard_str)
    for length in range(max_length, 1, -1):
        for start in range(max_length - length + 1):
            substr = keyboard_str[start:start+length]
            keyboard_substrings.append((substr, length))

    # 自定义扣分权重:连续长度越长,扣分递增(可根据需求调整)
    def calculate_deduction(length):
        # 示例规则:长度2扣5,3扣15,4扣30,5扣50... 公式为 length*(length+3)*0.5
        return int(length * (length + 3) / 2) * 2  # 调整系数让扣分更明显

    # 遍历匹配所有键盘连续子串
    for substr, length in keyboard_substrings:
        start_idx = 0
        while start_idx <= len(password_lower) - length:
            current_sub = password_lower[start_idx:start_idx+length]
            if current_sub == substr:
                # 检查这段位置是否已经被扣分过
                if not any(i in used_indices for i in range(start_idx, start_idx+length)):
                    deduction = calculate_deduction(length)
                    score -= deduction
                    print(f"检测到键盘连续序列'{substr}',扣除{deduction}分")
                    # 标记这段位置为已使用
                    used_indices.update(range(start_idx, start_idx+length))
                # 跳过已匹配的片段,继续查找下一个
                start_idx += length
            else:
                start_idx += 1
    return score

# 测试示例
test_password = "djoDFGibTY"
initial_score = 100
final_score = deduct_keyboard_pattern_score(test_password, initial_score)
print(f"初始分数:{initial_score},最终分数:{final_score}")

代码说明

  • 大小写处理:通过password.lower()统一转为小写,确保"DFG"和"dfg"都能匹配。
  • 避免重复扣分:用used_indices集合记录已经扣过分的字符索引,比如匹配了"dfg"后,里面的"df"和"fg"不会再被单独扣分。
  • 自定义扣分规则:calculate_deduction函数可以根据你的需求调整,比如你想要连续2个扣5分、3个扣15分、4个扣30分,直接修改公式即可。
  • 测试示例:输入密码djoDFGibTY会匹配到"dfg"(长度3,扣18分)和"ty"(长度2,扣10分),初始100分最终会得到72分。

可选优化

如果你不需要严格避免重复扣分(比如希望即使长片段包含短片段,也分别扣分),只需要删除used_indices相关的代码即可,但这种情况会导致分数扣得过于严厉,一般不推荐。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:30:12