PHP实现把数字ID转字母ID


Posted in PHP onAugust 12, 2013

ID是网站中经常出现的,它一般是数字,但是我们发现现在的网站很多ID都是字母了,比如YouTube的视频播放页它的URL类似/watch?v=yzNjIBEdyww。 下面是一个生成字母ID的方法。
使用示例:

   alphaID(12354);  //会将数字转换为字母。
   alphaID('PpQXn7COf',true);//会将字母ID转换为对应的数字。
   alphaID(12354,false,6);//指定生成字母ID的长度为6.

源码:
<?php
/**
 * Translates a number to a short alhanumeric version
 *
 * Translated any number up to 9007199254740992
 * to a shorter version in letters e.g.:
 * 9007199254740989 --> PpQXn7COf
 *
 * specifiying the second argument true, it will
 * translate back e.g.:
 * PpQXn7COf --> 9007199254740989
 *
 * this function is based on any2dec && dec2any by
 * fragmer[at]mail[dot]ru
 * see: http://nl3.php.net/manual/en/function.base-convert.php#52450
 *
 * If you want the alphaID to be at least 3 letter long, use the
 * $pad_up = 3 argument
 *
 * In most cases this is better than totally random ID generators
 * because this can easily avoid duplicate ID's.
 * For example if you correlate the alpha ID to an auto incrementing ID
 * in your database, you're done.
 *
 * The reverse is done because it makes it slightly more cryptic,
 * but it also makes it easier to spread lots of IDs in different
 * directories on your filesystem. Example:
 * $part1 = substr($alpha_id,0,1);
 * $part2 = substr($alpha_id,1,1);
 * $part3 = substr($alpha_id,2,strlen($alpha_id));
 * $destindir = "/".$part1."/".$part2."/".$part3;
 * // by reversing, directories are more evenly spread out. The
 * // first 26 directories already occupy 26 main levels
 *
 * more info on limitation:
 * - http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-talk/165372
 *
 * if you really need this for bigger numbers you probably have to look
 * at things like: http://theserverpages.com/php/manual/en/ref.bc.php
 * or: http://theserverpages.com/php/manual/en/ref.gmp.php
 * but I haven't really dugg into this. If you have more info on those
 * matters feel free to leave a comment.
 *
 * @author  Kevin van Zonneveld <kevin@vanzonneveld.net>
 * @author  Simon Franz
 * @author  Deadfish
 * @copyright 2008 Kevin van Zonneveld (http://kevin.vanzonneveld.net)
 * @license   http://www.opensource.org/licenses/bsd-license.php New BSD Licence
 * @version   SVN: Release: $Id: alphaID.inc.php 344 2009-06-10 17:43:59Z kevin $
 * @link    http://kevin.vanzonneveld.net/
 *
 * @param mixed   $in    String or long input to translate
 * @param boolean $to_num  Reverses translation when true
 * @param mixed   $pad_up  Number or boolean padds the result up to a specified length
 * @param string  $passKey Supplying a password makes it harder to calculate the original ID
 *
 * @return mixed string or long
 */
function alphaID($in, $to_num = false, $pad_up = false, $passKey = null)
{
  $index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  if ($passKey !== null) {
    // Although this function's purpose is to just make the
    // ID short - and not so much secure,
    // with this patch by Simon Franz (http://blog.snaky.org/)
    // you can optionally supply a password to make it harder
    // to calculate the corresponding numeric ID    for ($n = 0; $n<strlen($index); $n++) {
      $i[] = substr( $index,$n ,1);
    }
    $passhash = hash('sha256',$passKey);
    $passhash = (strlen($passhash) < strlen($index))
      ? hash('sha512',$passKey)
      : $passhash;
    for ($n=0; $n < strlen($index); $n++) {
      $p[] =  substr($passhash, $n ,1);
    }
    array_multisort($p,  SORT_DESC, $i);
    $index = implode($i);
  }
  $base  = strlen($index);
  if ($to_num) {
    // Digital number  <<--  alphabet letter code
    $in  = strrev($in);
    $out = 0;
    $len = strlen($in) - 1;
    for ($t = 0; $t <= $len; $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 {
    // Digital number  -->>  alphabet letter code
    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); // reverse
  }
  return $out;
}
PHP 相关文章推荐
PHP.MVC的模板标签系统(五)
Sep 05 PHP
php 全局变量范围分析
Aug 07 PHP
php4与php5的区别小结(配置异同)
Dec 20 PHP
在smarty中调用php内置函数的方法
Feb 07 PHP
php使用fgetcsv读取csv文件出现乱码的解决方法
Nov 08 PHP
php模拟登陆的实现方法分析
Jan 09 PHP
php基于GD库画五星红旗的方法
Feb 24 PHP
详解PHP中的mb_detect_encoding函数使用方法
Aug 18 PHP
PHP模板引擎Smarty中变量的使用方法示例
Apr 11 PHP
PHP示例演示发送邮件给某个邮箱
Apr 03 PHP
详解PHP中curl_multi并发的实现
Jun 08 PHP
PHP number_format函数原理及实例解析
Jul 14 PHP
PHP计算2点经纬度之间的距离代码
Aug 12 #PHP
php读取csv文件后,uft8 bom导致在页面上显示出现问题的解决方法
Aug 10 #PHP
浅析php中常量,变量的作用域和生存周期
Aug 10 #PHP
浅析linux下apache服务器的配置和管理
Aug 10 #PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 #PHP
php 删除目录下N分钟前创建的所有文件的实现代码
Aug 10 #PHP
php中如何判断一个网页请求是ajax请求还是普通请求
Aug 10 #PHP
You might like
第十三节 对象串行化 [13]
2006/10/09 PHP
PHP集成百度Ueditor 1.4.3
2014/11/23 PHP
一款简单实用的php操作mysql数据库类
2014/12/08 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
php检查页面是否被百度收录
2015/10/28 PHP
PHP 将数组打乱 shuffle函数的用法及简单实例
2016/06/17 PHP
php微信开发之关注事件
2018/06/14 PHP
javascript 得到变量类型的函数
2010/05/19 Javascript
jquery选择器(常用选择器说明)
2010/09/28 Javascript
jquery fancybox ie6不显示关闭按钮的解决办法
2013/12/25 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
JavaScript检查数字是否为整数或浮点数的方法
2015/06/09 Javascript
js实现简单的验证码
2015/12/25 Javascript
Bootstrap作品展示站点实战项目2
2016/10/14 Javascript
JS文件上传神器bootstrap fileinput详解
2021/01/28 Javascript
BootStrap 实现各种样式的进度条效果
2016/12/07 Javascript
ES6中Proxy代理用法实例浅析
2017/04/06 Javascript
基于vue的短信验证码倒计时demo
2017/09/13 Javascript
详解Angular调试技巧之报错404(not found)
2018/01/31 Javascript
promise和co搭配生成器函数方式解决js代码异步流程的比较
2018/05/25 Javascript
解决vue中post方式提交数据后台无法接收的问题
2018/08/11 Javascript
node微信开发之获取access_token+自定义菜单
2019/03/17 Javascript
Python正则表达式匹配ip地址实例
2014/10/09 Python
运行django项目指定IP和端口的方法
2018/05/14 Python
对Python 3.2 迭代器的next函数实例讲解
2018/10/18 Python
python opencv摄像头的简单应用
2019/06/06 Python
python3实现在二叉树中找出和为某一值的所有路径(推荐)
2019/12/26 Python
大一期末自我鉴定
2013/12/13 职场文书
毕业生的自我评价
2013/12/30 职场文书
关于赌博的检讨书
2014/01/24 职场文书
大学毕业感言一句话
2014/02/06 职场文书
优秀护士获奖感言
2014/02/20 职场文书
中学生演讲稿
2014/04/26 职场文书
2015年科室工作总结
2015/04/10 职场文书
房屋质量投诉书
2015/07/02 职场文书
Go语言实现Base64、Base58编码与解码
2021/07/26 Golang