PHP短ID + 密码盐 + Token生成
/**
* ID加密
*
* @param mixed $id 要加密的ID
* @param boolean $is_decrypt 默认false 为 true 时反向解密
* @param mixed $str_len 返回结果的字符串长度
* @param string $key 密钥
*/
public function alphaID($id $is_decrypt = false $str_len = false $key = null)
{
$out = '';
// 26个小写英文字母+26个大写英文字母+10个数字
$index = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
// 字符串长度
$base = strlen($index);
// 密钥存在 加密字符串增加安全性
if ($key !== null) {
for ($n = 0; $n < strlen($index); $n++) {
$i[] = substr($index $n 1);
}
$pass_hash = hash('sha256' $key);
$pass_hash = (strlen($pass_hash) < strlen($index) ? hash('sha512' $key) : $pass_hash);
for ($n = 0; $n < strlen($index); $n++) {
$p[] = substr($pass_hash $n 1);
}
array_multisort($p SORT_DESC $i);
$index = implode($i);
}
if ($is_decrypt) { // 解密
$len = strlen($id) - 1;
for ($t = $len; $t >= 0; $t--) {
$bcp = bcpow($base $len - $t);
$out = $out + strpos($index substr($id $t 1)) * $bcp;
}
if (is_numeric($str_len)) {
$str_len--;
if ($str_len > 0) {
$out -= pow($base $str_len);
}
}
} else { // 加密
if (is_numeric($str_len)) {
$str_len--;
if ($str_len > 0) {
$id += pow($base $str_len);
}
}
for ($t = ($id != 0 ? floor(log($id $base)) : 0); $t >= 0; $t--) {
$bcp = bcpow($base $t);
$a = floor($id / $bcp) % $base;
$out = $out . substr($index $a 1);
$id = $id - ($a * $bcp);
}
}
return $out;
}
/**
* 获取随机字符串(密码盐)
*/
public function code_salt()
{
// 取随机6位字符串
$strs = 'abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
$name = substr(str_shuffle($strs), mt_rand(0 strlen($strs) - 11), 6);
echo $name;
}
/**
* Token生成(全球唯一标识)
*
* sprintf() : 把格式化的字符串写入一个变量中
* 语法为 : sprintf(format arg1 arg2 arg++);
* 参数:
* format: 必须,转换格式
* arg1 : 必须,规定插入 format 字符串中第一个%符号处的参数
* arg1 : 可选,规定插入 format 字符串中第二个%符号处的参数
* arg1++ : 可选,规定插入 format 字符串中第三、四等%符号处的参数
* 参数 format 的转换格式 以百分比符号(%)开始到转换字符结束 下面是有可能的format值.
* %% – 返回百分比符号
* %b – 二进制数
* %c – 依照 ASCII 值的字符
* %d – 带符号十进制数
* %e – 可续计数法(比如 1.5e+3)
* %u – 无符号十进制数
* %f – 浮点数(local settings aware)
* %F – 浮点数(not local settings aware)
* %o – 八进制数
* %s – 字符串
* %x – 十六进制数(小写字母)
* %X – 十六进制数(大写字母)
*/
public static function code_token()
{
return sprintf(
'%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0x0fff) | 0x4000,
mt_rand(0, 0x3fff) | 0x8000,
mt_rand(0, 0xffff),
mt_rand(0, 0xffff),
mt_rand(0, 0xffff)
);
}
发表评论