以下是对使用PHP把数字ID转字母ID的实现代码进行了详细的分析介绍,需要的朋友可以过来参考下
ID是网站中经常出现的,香港服务器租用,它一般是数字,但是我们发现现在的网站很多ID都是字母了,比如YouTube的视频播放页它的URL类似/watch?v=yzNjIBEdyww。 下面是一个生成字母ID的方法。
复制代码 代码如下:
alphaID(12354); //会将数字转换为字母。
alphaID('PpQXn7COf',true);//会将字母ID转换为对应的数字。
alphaID(12354,false,6);//指定生成字母ID的长度为6.
复制代码 代码如下:
/**
* 将数字翻译成简短的字母数字版本
*
* 将 9007199254740992 以内的任何数字翻译成较短的字母版本,例如:
* 9007199254740989 --> PpQXn7COf
*
* 指定第二个参数 true,它将
* 翻译回来,例如:
* PpQXn7COf --> 9007199254740989
*
* 此函数基于any2dec && dec2any by
* fragmer[at]mail[dot]ru
* 请参阅:#52450
*
* 如果您想要alphaID 至少为 3 个字母长,请使用
* $pad_up = 3 参数
*
* 在大多数情况下,这比完全随机的 ID 生成器
* 因为这可以轻松避免重复ID。
* 例如,如果您将 alpha ID 与数据库中的自动递增 ID
* 相关联,则完成。
*
* 执行相反的操作,因为它会使其稍微多一些神秘,
* 但它也使得在文件系统上的不同
* 目录中传播大量 ID 变得更容易。示例:
* $part1 = substr($alpha_id,0,1);
* $part2 = substr($alpha_id,1,1);
* $part3 = substr($alpha_id,2, strlen($alpha_id));
* $destindir = "/".$part1."/".$part2."/".$part3;
* // 通过反转,目录分布得更均匀。
* // 前 26 个目录已占据 26 个主要级别
*
* 有关限制的更多信息:
* -
*
* 如果您确实需要更大的数字,您可以可能必须看看
*之类的东西:
*或:
*但我还没有真正深入研究这一点。如果您有更多关于这些
*问题,请随时发表评论。
*
* @author Kevin van Zonneveld
* @author Simon Franz
* @author Deadfish
* @copyright 2008 Kevin van Zonneveld ()
* @license 新 BSD 许可证
* @version SVN:发布:$Id:alphaID.inc.php 344 2009-06-10 17:43:59Z kevin $
* @link
*
* @param mix $in 要翻译的字符串或长输入
* @param boolean $to_num 如果为 true
* @ param mix $pad_up 数字或布尔值将结果填充到指定长度
* @param string $passKey 提供密码会使计算原始 ID 变得更加困难
*
* @return 混合字符串或 long
*/
function alphaID($in, $to_num = false, $pad_up = false, $passKey = null)
{
$index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
if ($passKey !== null) {
// 虽然此函数的目的只是使
// ID 较短 - 并且不太安全,
// 使用 Simon Franz 的此补丁 ()
// 您可以选择提供密码以使其变得更加困难
// 计算相应的数字 ID
for ($n = 0; $n
}
$passhash = hash(' sha256',$passKey);
$passhash = (strlen($passhash)
: $passhash;
for ($n=0; $n $p[] = substr($passhash, $n ,1);
}
array_multisort($p, SORT_DESC, $i);
$index = implode($i);
}
$base = strlen($index);
if ($to_num) {
// 数字 $in = strrev( $in);
$out = 0;
$len = strlen($in) - 1;
for ($t = 0; $t $bcpow = bcpow($base, $len - $t);
$out = $out strpos($index, substr($in, $t, 1)) * $bcpow;
}
if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$out -= pow($base, $pad_up);
}
}
$out = sprintf('%F', $out);
$out = substr($out, 0, strpos($out, '.'));
}else {
// 数字 -->> 字母代码
if (is_numeric($pad_up)) {
$pad_up--;
if ($pad_up > 0) {
$in = pow($base, $pad_up);
}
}
$out = "";
for ($t = Floor(log($in, $base)); $t >= 0; $t- -) {
$bcp = bcpow($base, $t);
$a = Floor($in / $bcp) % $base;
$out = $out 。 substr($index, $a, 1);
$in = $in - ($a * $bcp);
}
$out = strrev($out); // 反转
}
return $out;
}