使用PHP生成MD5库的算法
浏览数 194081
赞
(0)
用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;
}
?>
-->
占用表容量计算方法是:
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;
}
?>
-->