一個PHP通用隨機密碼的實現

發表於2019-05-11

在專案裡有用到生成隨機密碼的需求,然後看到網上的
收到啟發,就自己寫了一個。
程式碼如下:
/**
 * 用於生成唯一密碼(加密方式md5)
 * @param len int 密碼長度 預設8
 * @param pattern string 密碼字元的範圍 第一個是阿拉伯數字 開關 第二個是小寫字母 第三個大寫字母 第四個是特殊字元 如果 都用到就是1111 至少要有一個1
 */
function randpass($len=8, $pattern='1000', $encode='md5')
{
    static $seed = array(
        '0123456789',
        'abcdefghijklmnopqrstuvwxyz',
        'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
        '+=-@#~,.[]()!%^*開關 1代表開啟 0表示關閉。。
不同專案資料庫,判斷自己寫下。
    );
    if(!is_string($pattern) || strpos('1', $pattern) == -1 || strlen($pattern) > count($seed))
        send_error('','生成隨機字元傳模式格式有誤');
    $pattern = str_split($pattern);
    $randStr = '';
    foreach ($pattern as $key => $value) {
        if($value == '1')
            $randStr .= $seed[$key];
    }
    // echo $randStr;
    $temppass = array_fill(0, $len, '');
    if(!function_exists('getChar')){
        function getChar(&$value, $key, $seed){
            $value = $seed[mt_rand(0,strlen($seed)-1)];
        }
    }
    array_walk($temppass, 'getChar', $randStr);
    $temppass = implode('', $temppass);
    # 資料庫碰撞判斷
    $check_sql = "SELECT `uid` FROM user WHERE `password` = '".$encode($temppass)."'";
    if(get_var($check_sql))
        $temppass = randpass($len, $pattern, $encode);
    return $temppass;
}
開關 1代表開啟 0表示關閉。。
不同專案資料庫,判斷自己寫下。

send_error 自己改成自己的報錯方式。。
評論(1)

相關文章