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 根据IP地址控制访问的代码
Apr 22 PHP
详解PHP内置访问资源的超时时间 time_out file_get_contents read_file
Jun 03 PHP
ThinkPHP的截取字符串函数无法显示省略号的解决方法
Jun 25 PHP
使用PHP把HTML生成PDF文件的几个开源项目介绍
Nov 17 PHP
php模拟用户自动在qq空间发表文章的方法
Jan 07 PHP
php中curl使用指南
Feb 05 PHP
php实现在服务器上创建目录的方法
Mar 16 PHP
CodeIgniter中使用Smarty3基本配置
Jun 29 PHP
Zend Framework框架Smarty扩展实现方法
Mar 22 PHP
php opendir()列出目录下所有文件的实例代码
Oct 02 PHP
PHP合并数组的2种方法小结
Nov 24 PHP
PHP 实现缩略图
Mar 09 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实现求两个字符串最长公共子串的方法示例
2017/11/17 PHP
Laravel 6 将新增为指定队列任务设置中间件的功能
2019/08/06 PHP
Js中sort()方法的用法
2006/11/04 Javascript
javascript innerHTML使用分析
2010/12/03 Javascript
简短几句 通俗解释javascript的闭包
2011/01/17 Javascript
使用GruntJS构建Web程序之安装篇
2014/06/04 Javascript
JavaScript 事件入门知识
2015/04/13 Javascript
jQuery实现标题有打字效果的焦点图代码
2015/11/16 Javascript
jQuery插件Easyui设置datagrid的pageNumber导致两次请求问题的解决方法
2016/08/06 Javascript
JavaScript实现同一个页面打开多张图片
2016/12/29 Javascript
JavaScript设计模式之代理模式详解
2017/06/09 Javascript
React + webpack 环境配置的方法步骤
2017/09/07 Javascript
Vue.js移动端左滑删除组件的实现代码
2017/09/08 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
世界上最短的数字判断js代码
2019/09/09 Javascript
vue中实现动态生成二维码的方法
2020/02/21 Javascript
使用Python的内建模块collections的教程
2015/04/28 Python
python3+PyQt5泛型委托详解
2018/04/24 Python
Flask之flask-session的具体使用
2018/07/26 Python
连接pandas以及数组转pandas的方法
2019/06/28 Python
使用Python实现图像标记点的坐标输出功能
2019/08/14 Python
python防止随意修改类属性的实现方法
2019/08/21 Python
Python模块future用法原理详解
2020/01/20 Python
详解python中GPU版本的opencv常用方法介绍
2020/07/24 Python
Nike爱尔兰官方网站:Nike.com (IE)
2018/03/12 全球购物
C#如何调用Word并打开一个Word文档
2013/05/08 面试题
污水厂厂长岗位职责
2014/01/04 职场文书
学习2014年全国两会心得体会
2014/03/12 职场文书
六一儿童节活动总结
2014/08/27 职场文书
二人合伙经营协议书
2014/09/13 职场文书
合作合同协议书范本
2015/01/27 职场文书
2015年客房服务员工作总结
2015/05/15 职场文书
幽灵公主观后感
2015/06/09 职场文书
Eclipse+Java+Swing+Mysql实现电影购票系统(详细代码)
2022/01/18 Java/Android
Java 多态分析
2022/04/26 Java/Android