zoukankan      html  css  js  c++  java
  • 密码验证连续多位相同或者顺序字符引发的思考.md

    密码验证连续多位相同或者顺序字符引发的思考

    需求

    虽然用户对于这种复杂的密码验证恨之入骨,但是有时出于安全的考虑,我们系统不得不强制要求用户设置更高强度的密码。
    如:不能连续出现多位相同或者连续的字符。


    思考

    对于常规的验证,我们通常使用正则表达式,所以我一开始也从这方面入手,但始终没有一个实现的思路。
    后来看到有人用字符数组,通过下标判断是否连续,再加上偶然看到有人在讨论 ASCII 码,灵机一动,结合这两者就是一个很好的实现。


    实现

    简单实现,如下所示:

    import static org.junit.Assert.*;
    import org.junit.Test;
    public class MainTest {
        @Test
        public void test() {
            String password = "abcdd";
            boolean isRepeat = isRepeatChar(password, 1);
            boolean isOrder = isOrderChar(password, 3);
            assertEquals(true, isRepeat);
            assertEquals(true, isOrder);
        }
        /**
         * 是否存在连续 i 位顺序字符
         * @param str
         * @param i 存在 i 位顺序字符,i 应大于等于1
         * @return 如果 i 位顺序的字符,则返回 true,否则返回 false
         */
        private boolean isOrderChar(String str, int i) {
            char[] charArr = str.toCharArray();
            int len = charArr.length;
            int count = 0;
            int t = charArr[0];
            for (int j = 1; j < len; j++) {
                if ((t + 1) == charArr[j]) {
                    count ++;
                    if (count == i) {
                        return true;
                    }
                } else {
                    count = 0;
                }
                t = charArr[j];
            }
            return false;
        }
        /**
         * 字符串中是否至少包含 i 位重复相同的字符
         * @param str
         * @param i i位重复数字,i 应大于等于1
         * @return 如果包含 i 位重复相同的字符,则返回 true,否则返回 false
         */
        private boolean isRepeatChar(String str, int i) {
            char[] charArr = str.toCharArray();
            int len = charArr.length;
            int count = 0;
            int t = charArr[0];
            for (int j = 1; j < len; j++) {
                if (t == charArr[j]) {
                    count ++;
                    if (count == i) {
                        return true;
                    }
                } else {
                    t = charArr[j];
                    count = 0;
                }
            }
            return false;
        }
    }
    

    总结

    实现是很简单的,但是如果执着在正则表达式,可能再尝试很久都做不出来,而且明显增加难度,也不是一个好的实现方式。
    字符数组下标的实现方式,对于 1-9,a-z,A-Z,虽然是有限的枚举,先不说好不好,自己写起来就很烦。
    作文最后一句,喊口号:多思考,多尝试,多总结 。

    期待你更好的实现分享

    参考

  • 相关阅读:
    mybatis中的#和$的区别
    error: 40
    SenseTime Ace Coder Challenge 暨 商汤在线编程挑战赛* B. 我觉得海星
    AtCoder Regular Contest 093 D
    AtCoder Regular Contest 092 D
    2018 蓝桥杯省赛 B 组模拟赛(五) 结果填空:藏宝图
    2018/3/22 美团在线笔试 编程题
    2018/3/22美团在线笔试
    2018 蓝桥杯省赛 B 组模拟赛(一)青出于蓝胜于蓝
    心情小记
  • 原文地址:https://www.cnblogs.com/zhanyao/p/8983494.html
Copyright © 2011-2022 走看看