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 获取目录下的图片并随机显示的代码
Dec 28 PHP
PHP中基本符号及使用方法
Mar 23 PHP
组合算法的PHP解答方法
Feb 04 PHP
解析php DOMElement 操作xml 文档的实现代码
May 10 PHP
如何使用PHP实现javascript的escape和unescape函数
Jun 29 PHP
PHP英文字母大小写转换函数小结
May 03 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
Jul 10 PHP
PHP实现动态web服务器方法
Jul 29 PHP
PHP文件缓存类实现代码
Oct 26 PHP
php版微信公众平台入门教程之开发者认证的方法
Sep 26 PHP
PHP Socket网络操作类定义与用法示例
Aug 30 PHP
Thinkphp页面跳转设置跳转等待时间的操作
Oct 16 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操作文件方法问答
2007/03/16 PHP
php中用date函数获取当前时间有误的解决办法
2013/08/02 PHP
php自定义的格式化时间示例代码
2013/12/05 PHP
PHP使用pcntl_fork实现多进程下载图片的方法
2014/12/16 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
PHP实现的随机红包算法示例
2017/08/14 PHP
PHP与以太坊交互详解
2018/08/24 PHP
Javascript 各浏览器的 Javascript 效率对比
2008/01/23 Javascript
JavaScript使用技巧精萃[代码非常实用]
2008/11/21 Javascript
flash javascript之间的通讯方法小结
2008/12/20 Javascript
javascript对数组的常用操作代码 数组方法总汇
2011/01/27 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
jquery实现两个图片渐变切换效果的方法
2015/06/25 Javascript
mvc 、bootstrap 结合分布式图简单实现分页
2016/10/10 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
Node.js静态服务器的实现方法
2018/02/28 Javascript
解决vue数组中对象属性变化页面不渲染问题
2018/08/09 Javascript
vue项目使用微信公众号支付总结及遇到的坑
2018/10/23 Javascript
jQuery实现可以计算进制转换的计算器
2020/10/19 jQuery
[03:42]2014DOTA2西雅图国际邀请赛7月9日TOPPLAY
2014/07/09 DOTA
Python中的进程分支fork和exec详解
2015/04/11 Python
详解python的argpare和click模块小结
2019/03/31 Python
python3的url编码和解码,自定义gbk、utf-8的例子
2019/08/22 Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
2020/05/20 Python
套娃式文件夹如何通过Python批量处理
2020/08/23 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
python 操作excel表格的方法
2020/12/05 Python
Canvas多边形绘制的实现方法
2019/08/05 HTML / CSS
前端实现打印图像功能
2019/08/27 HTML / CSS
厂长助理岗位职责
2013/12/27 职场文书
俄罗斯商务邀请函
2014/01/26 职场文书
工程技术员岗位职责
2014/03/02 职场文书
小学生中国梦演讲稿
2014/04/23 职场文书
学校食品安全责任书
2015/01/29 职场文书
申论不会写怎么办?教您掌握这6点思维和原则
2019/07/17 职场文书
Pytest中skip和skipif的具体使用方法
2021/06/30 Python