YiluPHP
这家伙很懒,什么都没有留下...

经验 使用PHP生成MD5库的算法

浏览数 194081
用93个字符生成5位以内的所有密码,存储的表容量大约是 32.7 GB
占用表容量计算方法是:
1个英文字符为1个字节b
1024个英文字符为1kb
1024kb = 1mb
1024mb = 1gb

93个字符可以生成 93 的 5次方个密码,每个密码5个字符,总容量就是:
5*(93^5) = 34784418465 b
= 33969158.6572265625 kb
= 33173.00650119781494140625 mb
= 32.395514161325991153717041015625 gb

5位以内的密码还有4位、3位、2位、1位,算法是一样的。
生成4位数的密码占用容量:
285.359195709228515625 mb
= 0.2786710895597934722900390625 bg
生成6位数的密码占用容量:
3615.3393804039806127548217773438 gb
= 3.5306048636757623171433806419373 tb

1、2、3位数的占用容量就非常小了,基本可以忽略不计



以下是源代码:

$lt;!--?php
/* 创建记录生成进度的表
CREATE TABLE `progress_infor` (
`name`  varchar(20) NOT NULL ,
`current_length`  int(10) NOT NULL COMMENT '当前生成的字符长度' ,
`each_index`  text NOT NULL COMMENT '用数据存储每位字符当前的索引值,用于记录当前生成的进度的位置' ,
PRIMARY KEY (`name`)
)
INSERT INTO `progress_infor` (`name`, `current_length`, `each_index`)VALUES ('progress_infor', '1', '[]')

存储md5结果的表,不分表
CREATE TABLE `md5` (
`md5`  char(32) NOT NULL ,
`original_str`  text NULL ,
`cteated_at`  int(10) NULL ,
PRIMARY KEY (`md5`)

存储md5结果的表,1-4位字符串的
CREATE TABLE `md5_4` (
`md5`  char(32) NOT NULL ,
`original_str`  text NULL ,
`cteated_at`  int(10) NULL ,
PRIMARY KEY (`md5`)

存储md5结果的表,5位字符串的
CREATE TABLE `md5_5` (
`md5`  char(32) NOT NULL ,
`original_str`  text NULL ,
`created_at`  int(10) NULL ,
PRIMARY KEY (`md5`)
)
*/
    $mysql_host = '127.0.0.1';
    $mysql_username = 'root';
    $mysql_password = '123456';
    $database = 'md5_test';
    //Mysql 方式
    // $con = mysql_connect($mysql_host, $mysql_username, $mysql_password);
    // if (!$con)
    // {
    //     die('Could not connect: ' . mysql_error());
    // }
    // mysql_select_db($database);
    // $result = mysql_query("SELECT `name` FROM `users` WHERE `location` = '$location'"); 
  
    // while ($row = mysql_fetch_array($result,  MYSQL_ASSOC)) { 
    //     echo $row['name']; 
    // } 
  
    // mysql_free_result($result); 
    // exit('ok');
    // mysql_close($con);

    //PDO方式
    // $pdo = new PDO("mysql:host=$mysql_host;dbname=$database", $mysql_username, $mysql_password);//创建一个pdo对象
    // $pdo->exec("set names 'utf8'");
    // $sql = "select * from user where uname = ?";
    // $stmt = $pdo->prepare($sql);
    // $rs = $stmt->execute(array('aaa'));
    // $result = $stmt->fetch(PDO::FETCH_OBJ);
    // var_dump($result);

    //mysqli方式 面向对象风格
    // $mysqliObj = new mysqli($mysql_host,$mysql_username,$mysql_password,$database);
    // if(mysqli_connect_errno()){
    //  echo "连接失败".mysqli_connect_error();
    //  exit();
    // }
    // $mysqliObj->query('set name utf-8');
    // $sql = 'SELECT * FROM user WHERE uid>=?';
    // $uname = 2;
    // $stmt = $mysqliObj->prepare($sql);
    // $stmt->bind_param('i', $uname);
    // $stmt->execute();
    // //把输出的字段输出到指定的变量上
    // $stmt->bind_result($uid, $uname, $sex);
 //    /* fetch value */
 //    while ($stmt->fetch()) {
 //        var_dump($uid, $uname, $sex);
 //    }
 //    $stmt->close();
    // $mysqliObj->close();

    //原字符串
    $string = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ123456789,./;\'[]\\<>?:"{}|-=`~!@#$%^&*()_+';
   
    $pdo = new PDO("mysql:host=$mysql_host;dbname=$database", $mysql_username, $mysql_password);//创建一个pdo对象
    $pdo->exec("set names 'utf8'");
    //读取进度位置
    $sql = "select * from progress_infor where name = ?";
    $name = 'current_progress';
    $stmt = $pdo->prepare($sql);
    $rs = $stmt->execute(array($name));
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    if(!$result){
        exit('缺少进度位置。');
    }
    $length = $result['current_length'];
    //存储当前进度每位字符在原字符串中的索引
    $each_index = json_decode($result['each_index'], true);
    while ($length<=3) {
        create_str('', isset($each_index[0]) ? $each_index[0] : 0, $length-1, $each_index);

        $length++;
        $each_index = [];

        // 把进度的下一个位置存入库
        $sql = "UPDATE progress_infor SET current_length=?, each_index=? where name = ?";
        $stmt = $pdo->prepare($sql);
        $stmt->execute(array($length, json_encode($each_index), $name));
    }
   
    exit('生成完成'.strlen($string));
    // var_dump( strlen($string), strlen($str),  str_split($str), $str[1] );

    function create_str($pre_str, $index, $max_index, &$each_index) {
        global $string, $name, $length, $pdo;
        //取得从原字符串中的第几个字符开始使用
        $i = isset($each_index[$index]) ? $each_index[$index] : 0;
        for ($i; $i < strlen($string); $i++) {
            $each_index[$index] = $i;
            // var_dump($index .'=='. $i.'=='. $string[$i].'
');
            if ($index == $max_index) {
                // var_dump($index .'=='. $i.'=='. $pre_str.$string[$i].'
');
                //把md5值存入库
                $sql = "INSERT INTO `md5` (`md5`, `original_str`, `created_at`)VALUES (:md5, :original_str, NOW())";
                $stmt = $pdo->prepare($sql);
                $stmt->execute(array(':md5'=>md5($pre_str.$string[$i]), ':original_str'=>$pre_str.$string[$i]));
                // echo '
插入的记录ID:'.$pdo->lastinsertid();
                // var_dump($sql, array(':md5'=>md5($pre_str.$string[$i]), ':original_str'=>$pre_str.$string[$i]));
                //把进度的下一个位置存入库
                $sql = "UPDATE progress_infor SET each_index=? where name = ?";
                $stmt = $pdo->prepare($sql);
                $stmt->execute(array(json_encode($each_index), $name));
                // echo '
影响记录数:'.$stmt->rowCount();
                // var_dump($sql, array(json_encode($each_index), $name));
            }
            else if ($index < $max_index) {
                create_str($pre_str.$string[$i], $index+1, $max_index, $each_index);
            }
        }
        $each_index[$index] = 0;
    }
?>
-->
我来说说