工作中,经常会遇到兑换码功能的需求开发,这时候就会有各种问题
- 字母数字组合不好输入
- 纯数字兑换码容易被盲猜
- 其他问题
今天我们主要介绍一种带有真伪验证的数字兑换码生成方案。
真伪检测 code 创建代码
/**
* 创建带有真伪性验证的数字
* @param int $code 原始数字
* @param int $int_key 加密key(必须大于0,小于$code)
* @return int 结果数字比原数字长2位
*/
function create_code($code,$int_key){
$num = 0;$m = '5194268037';$n = '3061758429';
foreach (range(0,strlen($code)-1) as $k=>$v){
$num = $num + $code[$k];
}
$num = $num % intval($code/$int_key);
$num = substr(sprintf('%02s', $num),-2);
return $code.$m[$num[0]].$n[$num[1]];
}
真伪检测 code 检测代码
/**
* 验证带有真伪性验证的数字的真伪性
* @param int $code 原始数字
* @param int $int_key 加密key(必须大于0,小于$code)
* @return boolean
*/
function check_code($code,$int_key){
$tmp_code = substr($code,0,14);
$num = 0;$m = '5194268037';$n = '3061758429';
foreach (range(0,strlen($tmp_code)-1) as $k=>$v){
$num = $num + $tmp_code[$k];
}
$num = $num % intval($tmp_code/$int_key);
$num = substr(sprintf('%02s', $num),-2);
$check_code = $tmp_code.$m[$num[0]].$n[$num[1]];
if($check_code == $code){
return true;
}else{
return false;
}
}
测试使用
$str = '51650112989957';
//var_dump($str[0],$str[1]);
echo '<pre>'.$str.'<br />';
$int_key = 125637812;
$new_str = create_code($str,$int_key);
var_dump($new_str);
$check = check_code($new_str,$int_key);
var_dump($check);
一些说明
- 创建出来的 code 要比原来的数字多 2 位
- init_key 是会被除被取余的,所以不能是 0,也不能大于 code,因为取余后还要被除
- 方法里面的m n 其实就是 0~9 的排序,这个自己可以随意定义,目的就是让用户不好猜测,避免用户能简单算到的情况发生。
由于打到车了,今天的分享就草草结束吧!
其实算法类似身份证真伪验证那样,可以自己随意书写里面的真伪算法哦
再见!
🐶 你走,我不送你。你来,风雨无阻,我去接你。