Colin_Chen

Colin_Chen 查看完整档案

深圳编辑  |  填写毕业院校  |  填写所在公司/组织填写个人主网站
编辑
_ | |__ _ _ __ _ | '_ \| | | |/ _` | | |_) | |_| | (_| | |_.__/ \__,_|\__, | |___/ 该用户太懒什么也没留下

个人动态

Colin_Chen 回答了问题 · 2017-09-15

解决mybatis如何接收返回类型为Set<String> 呢

MyBatis是直接返回List的,可以直接像 @Rebuilding127 的回答使用Mapper类配置来做自动List转换Set。如果要用SqlSession来读取数据的话,可以自动做List到Set的转换,即:

List<String> roleList = sqlSessionTemplate.selectList("ShiroUser.findAllRoleNameByUsername", uname);
Set<String> roleSet = new HashSet<>(roleList);

关注 6 回答 5

Colin_Chen 赞了问题 · 2017-09-08

现在都在追求web的无状态化,那在目前看来传统的session模式还有什么益处吗 ?

现在前后端分离越来越普遍了,后端好像也不太需要维持会话了,那么现在由服务器保存session信息相比前端使用cookie或者localstorage存储有何优势呢?

关注 6 回答 4

Colin_Chen 回答了问题 · 2016-08-22

解决如何用Java判断两个文件内容是否相同?

如果你维护这些文件列表,并且后期会不定期进行比较,也就是确定一个文件有多次被比较的机会。可以计算这些文件的MD5并缓存起来,后期直接用MD5进行比较。
如果只是临时性的随机选两个文件进行比较,可以先比较文件大小,如果文件大小不同就说明文件内容不相同。如果大小相等的话,可以打开这两个文件的输入流,字节逐一比较,如果中间有不相等的字节就说明两个文件不相等,然后直接退出比较,需要注意的是文件流要缓冲(BufferedInputStream)。
之所以不推荐MD5是因为MD5也需要根据文件全部内容计算散列值,可是实际上中途发现有一个字节不相同就可以判定这两个文件是不同的,根本没必要去读取文件的全部内容。

        //in1, in2为两个文件的输入流,最后注意流的关闭
        int c;
        while ((c = in1.read()) != -1) {
            if (in2.read() != c) return false;
        }
        return true;

关注 5 回答 4

Colin_Chen 关注了问题 · 2016-08-22

解决如何用Java判断两个文件内容是否相同?

有两个任意格式的文件。

如何用Java判断两个文件是否一样?
或者内容是一样的(不考虑文件名等信息)。

需要考虑文件比较大的情况下的效率问题。

关注 5 回答 4

Colin_Chen 关注了问题 · 2016-08-18

解决密码规则正则匹配,另外问题:为什么正则表达式效率低?

规则如下:
密码格式:6-16位数字字母组合
不包含特殊字符。
必须同时包含数字、大写字母,小写字母3种字符,区分大小写。
连续3位及以上数字不能连续(例如123、876)
连续3位及以上的字母不能连续(例如abc、cba、aaa、111、AAA)

echo !preg_match('/\d{3,}|[a-zA-Z]{3,}/', $password);
echo preg_match('/\d+/', $password);
echo preg_match('/[a-z]+/', $password);
echo preg_match('/[A-Z]+/', $password);
echo preg_match('/^([a-zA-Z0-9]){6,16}$/', $password);

以上是需求和我想出来的解决方法

但是总想能用更简洁的方式来匹配出来,希望有人能有更好的思路。

再问个问题:为什么正则表达式效率低?

因为连续的数字,字母用正则表达式判断太复杂而且效率低,所以采用逻辑代码判断的方式,以下是我用PHP写的代码,php5.5.12 初步测试成功。

<?php
define('PWD_MAX_LENGTH', 16);
define('PWD_MIN_LENGTH', 6);

/**
 * @time 2016年8月29日11:52:29
 */
class User_Common {

    /**
     * 密码格式:6-16位数字字母组合
     * 不包含特殊字符。
     * 必须同时包含数字、大写字母,小写字母3种字符,区分大小写。
     * 连续3位及以上数字不能连续(例如123、876)
     * 连续3位及以上的字母不能连续(例如abc、cba)
     * @param $password
     * @return bool
     * @throws \Exception
     */
    public static function checkPassword($password) {
        self::pwdLengthCheck($password);
        self::pwdCharValid($password);
    }

    /**
     * @param $password
     * @return bool
     * @throws \Exception
     */
    private static function pwdCharValid($password) {
        if (!ctype_alnum($password)) {
            throw new Exception('不包含特殊字符', 10002);
        }
        $includeNumber = false;
        $includeUpperLetter = false;
        $includeLowerLetter = false;
        $length = strlen($password);

        for ($i=0; $i < $length; $i++) {
            $char = $password[$i];
            $includeUpperLetter = (!$includeUpperLetter && ctype_upper($char)) ? true : $includeUpperLetter;
            $includeNumber = (!$includeNumber && ctype_digit($char)) ? true : $includeNumber;
            $includeLowerLetter = (!$includeLowerLetter && ctype_lower($char)) ? true : $includeLowerLetter;
            if ($i != 0 && !empty($password[$i+1])
                && abs(ord($password[$i]) - ord($password[$i-1])) <=1
                && ord($password[$i]) - ord($password[$i-1]) == ord($password[$i+1]) - ord($password[$i])) {
                throw new Exception('连续3位及以上数字或字母不能连续(例如123、876)', 10004);
            }
        }
        if ($includeLowerLetter && $includeNumber && $includeUpperLetter) {
            return 2;
        } else {
            throw new Exception('必须同时包含数字、大写字母,小写字母3种字符,区分大小写', 10003);
        }
    }

    private static function pwdLengthCheck($password) {
        if (strlen($password) > PWD_MAX_LENGTH || strlen($password) < PWD_MIN_LENGTH) {
            throw new Exception('密码格式:6-16位数字字母组合', 10001);
        }
    }

    /**
     * 检查是否为1开头的11位数字手机号
     * @param int $phoneNumber
     * @return boolean 是否匹配
     */
    public static function checkPhoneNumber($phoneNumber) {
        return preg_match('/^1\d{10}$/', $phoneNumber);
    }
}



try {
    var_dump(User_Common::checkPassword('AbA001'));
} catch (Exception $e) {
    echo $e->getMessage();
}

关注 7 回答 2

Colin_Chen 关注了问题 · 2016-08-18

解决mysql 怎么做到update只更新一行数据?


UPDATE quan.hexiao_code SET sort_code='LKUHFS' WHERE sort_code='SAMQLF';

这句话的where部分有两条记录,我只想修改其中一条,该怎么写?

关注 3 回答 2

Colin_Chen 关注了问题 · 2016-08-18

解决mysql 怎么做到update只更新一行数据?


UPDATE quan.hexiao_code SET sort_code='LKUHFS' WHERE sort_code='SAMQLF';

这句话的where部分有两条记录,我只想修改其中一条,该怎么写?

关注 3 回答 2

Colin_Chen 回答了问题 · 2016-08-18

解决mysql 怎么做到update只更新一行数据?

我不知道楼主为什么会有这样的问题,在数据库当中每一条数据不应该都是独立的一条吗,有它自己的特征才对。所以当你WHERE sort_code='SAMQLF'的时候很明显的意思就是更新所有匹配的数据。你如果只是更新一条,那么更新的是哪一条?是不是应该有它的特征才对,所以你应该把这个特征加上。
如果你就是那么任性的要随机更新匹配的一条,我的方案就是随机查出sort_code='SAMQLF'的一条记录的ID,用ID来更新这条记录。


刚刚看到了 @shuhai 的回答,感谢他让我知道了还有这样的语法,学艺不精- - |||
用UPDATE LIMIT 1确实能解决楼主的问题。不过我还是推荐楼主应该有明确的,比如只更新匹配的并且ID最大的一条UPDATE quan.hexiao_code SET sort_code='LKUHFS' WHERE sort_code='SAMQLF' ORDER BY id DESC LIMIT 1

关注 3 回答 2

Colin_Chen 关注了问题 · 2016-08-18

解决密码规则正则匹配,另外问题:为什么正则表达式效率低?

规则如下:
密码格式:6-16位数字字母组合
不包含特殊字符。
必须同时包含数字、大写字母,小写字母3种字符,区分大小写。
连续3位及以上数字不能连续(例如123、876)
连续3位及以上的字母不能连续(例如abc、cba、aaa、111、AAA)

echo !preg_match('/\d{3,}|[a-zA-Z]{3,}/', $password);
echo preg_match('/\d+/', $password);
echo preg_match('/[a-z]+/', $password);
echo preg_match('/[A-Z]+/', $password);
echo preg_match('/^([a-zA-Z0-9]){6,16}$/', $password);

以上是需求和我想出来的解决方法

但是总想能用更简洁的方式来匹配出来,希望有人能有更好的思路。

再问个问题:为什么正则表达式效率低?

因为连续的数字,字母用正则表达式判断太复杂而且效率低,所以采用逻辑代码判断的方式,以下是我用PHP写的代码,php5.5.12 初步测试成功。

<?php
define('PWD_MAX_LENGTH', 16);
define('PWD_MIN_LENGTH', 6);

/**
 * @time 2016年8月29日11:52:29
 */
class User_Common {

    /**
     * 密码格式:6-16位数字字母组合
     * 不包含特殊字符。
     * 必须同时包含数字、大写字母,小写字母3种字符,区分大小写。
     * 连续3位及以上数字不能连续(例如123、876)
     * 连续3位及以上的字母不能连续(例如abc、cba)
     * @param $password
     * @return bool
     * @throws \Exception
     */
    public static function checkPassword($password) {
        self::pwdLengthCheck($password);
        self::pwdCharValid($password);
    }

    /**
     * @param $password
     * @return bool
     * @throws \Exception
     */
    private static function pwdCharValid($password) {
        if (!ctype_alnum($password)) {
            throw new Exception('不包含特殊字符', 10002);
        }
        $includeNumber = false;
        $includeUpperLetter = false;
        $includeLowerLetter = false;
        $length = strlen($password);

        for ($i=0; $i < $length; $i++) {
            $char = $password[$i];
            $includeUpperLetter = (!$includeUpperLetter && ctype_upper($char)) ? true : $includeUpperLetter;
            $includeNumber = (!$includeNumber && ctype_digit($char)) ? true : $includeNumber;
            $includeLowerLetter = (!$includeLowerLetter && ctype_lower($char)) ? true : $includeLowerLetter;
            if ($i != 0 && !empty($password[$i+1])
                && abs(ord($password[$i]) - ord($password[$i-1])) <=1
                && ord($password[$i]) - ord($password[$i-1]) == ord($password[$i+1]) - ord($password[$i])) {
                throw new Exception('连续3位及以上数字或字母不能连续(例如123、876)', 10004);
            }
        }
        if ($includeLowerLetter && $includeNumber && $includeUpperLetter) {
            return 2;
        } else {
            throw new Exception('必须同时包含数字、大写字母,小写字母3种字符,区分大小写', 10003);
        }
    }

    private static function pwdLengthCheck($password) {
        if (strlen($password) > PWD_MAX_LENGTH || strlen($password) < PWD_MIN_LENGTH) {
            throw new Exception('密码格式:6-16位数字字母组合', 10001);
        }
    }

    /**
     * 检查是否为1开头的11位数字手机号
     * @param int $phoneNumber
     * @return boolean 是否匹配
     */
    public static function checkPhoneNumber($phoneNumber) {
        return preg_match('/^1\d{10}$/', $phoneNumber);
    }
}



try {
    var_dump(User_Common::checkPassword('AbA001'));
} catch (Exception $e) {
    echo $e->getMessage();
}

关注 7 回答 2

Colin_Chen 回答了问题 · 2016-08-18

解决密码规则正则匹配,另外问题:为什么正则表达式效率低?

为什么一定要使用正则,要知道这种问题用正则要写多长,而且你写的正则也不对。自己做遍历不是更简单高效吗?

以下是伪代码,语法请忽略:)

password = getPassword()  //获取密码
if (password.length < 6 || password.length > 16) throw 长度错误;  //判断长度
hasNumber = false
hasUpper = false
hasLower = false
preDiff = 0
preChar = null
for (char in password) {  //遍历取出字符
  if (!hasNumber) hasNumber = isNumber(char); //判断是否包含数字
  if (!hasUpper) hasUpper = isUpper(char); //判断是否包含大写字母
  if (!hasLower) hasLower = isLower(char); //判断是否包含小写字母
  if (isSpecial(char)) throw 包含特殊字符; //判断是否包含特殊字符
  diff = getDiff(preChar, char); //获取字符的ASCII码与上一个字符的差
  //如果preDiff与diff差都为-1或1,则认为连续
  if (abs(preDiff) == 1 && preDiff == diff) throw 字母或数字连续错误; //可单独判断char求是字母还是数字连续
  preChar = char;
  preDiff = diff;
}

在上例代码中

6-16位数字字母组合
不包含特殊字符。
必须同时包含数字、大写字母,小写字母3种字符,区分大小写。

应该都都看懂怎么判断的,至于是否连续主要是利用字符的ASCII码,并且0-9、a-z、A-Z在ASCII中是连续的。保存前两个字符ASCII差与当前字符ASCII差来判断是否三个连续。

关注 7 回答 2

认证与成就

  • 获得 15 次点赞
  • 获得 5 枚徽章 获得 0 枚金徽章, 获得 0 枚银徽章, 获得 5 枚铜徽章

擅长技能
编辑

开源项目 & 著作
编辑

(゚∀゚ )
暂时没有

注册于 2016-08-16
个人主页被 200 人浏览