ID加密:
/**
* 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;
}
生成指定长度随机字符串:
/**
* 生成指定长度随机字符串
* @param $len
* @return null|string
*/
function randStr($len)
{
$randStr = null;
$strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";
$max = strlen($strPol) - 1;
for ($i = 0; $i < $len; $i++) {
$randStr .= $strPol[rand(0, $max)];
}
return $randStr;
}
Token生成(全球唯一标识):
/**
* 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)
);
}