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页面间传递参数实例代码
Jun 05 PHP
php dirname(__FILE__) 获取当前文件的绝对路径
Jun 28 PHP
destoon常用的安全设置概述
Jun 21 PHP
php中$_GET与$_POST过滤sql注入的方法
Nov 03 PHP
PHP实现获取域名的方法小结
Nov 05 PHP
php设置静态内容缓存时间的方法
Dec 01 PHP
php实现可运算的验证码
Nov 10 PHP
php生成唯一数字id的方法汇总
Nov 18 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 PHP
浅谈PHP中如何实现Hook机制
Nov 14 PHP
PHP基于cookie实现统计在线人数功能示例
Jan 16 PHP
phpQuery解析HTML乱码问题(补充官网未列出的乱码解决方案)
Apr 01 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
PHP一些常用的正则表达式字符的一些转换
2008/07/29 PHP
php的数组与字符串的转换函数整理汇总
2013/07/18 PHP
使用PHP实现微信摇一摇周边红包
2016/01/04 PHP
YII2框架中查询生成器Query()的使用方法示例
2020/03/18 PHP
jquery聚焦文本框与扩展文本框聚焦方法
2012/10/12 Javascript
在JavaScript中操作时间之getYear()方法的使用教程
2015/06/11 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
js实现九宫格布局效果
2020/05/28 Javascript
springboot+vue实现文件上传下载
2020/11/17 Vue.js
[49:54]Ti4 循环赛第三日 LGD vs Titan
2014/07/12 DOTA
操作Windows注册表的简单的Python程序制作教程
2015/04/07 Python
PyCharm-错误-找不到指定文件python.exe的解决方法
2019/07/01 Python
numpy实现神经网络反向传播算法的步骤
2019/12/24 Python
使用tensorflow显示pb模型的所有网络结点方式
2020/01/23 Python
使用pycharm和pylint检查python代码规范操作
2020/06/09 Python
Python类super()及私有属性原理解析
2020/06/15 Python
pandas to_excel 添加颜色操作
2020/07/14 Python
区分python中的进程与线程
2020/08/13 Python
Python通过类的组合模拟街道红绿灯
2020/09/16 Python
python动态规划算法实例详解
2020/11/22 Python
使用CSS3的rem属性制作响应式页面布局的要点解析
2016/05/24 HTML / CSS
Html5 web本地存储实例详解
2016/07/28 HTML / CSS
介绍一下MYSQL常用的优化技巧
2012/10/25 面试题
abstract class和interface有什么区别
2013/08/04 面试题
父亲追悼会答谢词
2014/01/17 职场文书
商场总经理岗位职责
2014/02/03 职场文书
万年牢教学反思
2014/02/15 职场文书
优秀大学生职业生涯规划书
2014/02/27 职场文书
金融专业求职信
2014/08/05 职场文书
高中校园广播稿
2014/10/21 职场文书
安全先进班组材料
2014/12/26 职场文书
考研复习计划
2015/01/19 职场文书
常务副总经理岗位职责
2015/02/02 职场文书
Mybatis-plus在项目中的简单应用
2021/07/01 Java/Android