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 将bmp图片转为jpg等其他任意格式的图片
Jun 21 PHP
163的邮件用phpmailer发送(实例详解)
Jun 24 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
Jul 18 PHP
一个严格的PHP Session会话超时时间设置方法
Jun 10 PHP
ThinkPHP的Widget扩展实例
Jun 19 PHP
如何通过Linux命令行使用和运行PHP脚本
Jul 29 PHP
php利用header函数下载各种文件
Aug 24 PHP
PHP实现求连续子数组最大和问题2种解决方法
Dec 26 PHP
PHP递归遍历文件夹去除注释并压缩php源代码的方法示例
May 23 PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
Jul 30 PHP
详解PHP PDO简单教程
May 28 PHP
Laravel Reponse响应客户端示例详解
Sep 03 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发电子邮件
2006/10/09 PHP
PHP简介
2006/10/09 PHP
PHP一致性hash分布式算法封装类定义与用法示例
2018/08/04 PHP
统一接口:为FireFox添加IE的方法和属性的js代码
2007/03/25 Javascript
基于Jquery的回车成tab焦点切换效果代码(Enter To Tab )
2010/11/14 Javascript
jQuery中prevAll()方法用法实例
2015/01/08 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
2015/06/20 Javascript
Underscore.js 1.3.3 中文注释翻译说明
2015/06/25 Javascript
javascript对浅拷贝和深拷贝的详解
2016/10/14 Javascript
vue系列之动态路由详解【原创】
2017/09/10 Javascript
vue router 组件的高级应用实例代码
2019/04/08 Javascript
javascript获取元素的计算样式
2019/05/24 Javascript
使用kbone解决Vue项目同时支持小程序问题
2019/11/08 Javascript
vue.config.js常用配置详解
2019/11/14 Javascript
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
Python的另外几种语言实现
2015/01/29 Python
Python手机号码归属地查询代码
2016/05/04 Python
对python中数组的del,remove,pop区别详解
2018/11/07 Python
Python协程 yield与协程greenlet简单用法示例
2019/11/22 Python
基于python实现监听Rabbitmq系统日志代码示例
2020/11/28 Python
HTML5 canvas实现移动端上传头像拖拽裁剪效果
2016/03/14 HTML / CSS
用html5的canvas和JavaScript创建一个绘图程序的简单实例
2016/07/06 HTML / CSS
瑞贝卡·泰勒官方网站:Rebecca Taylor
2016/09/24 全球购物
荷兰多品牌网上鞋店:Stoute Schoenen
2017/08/24 全球购物
大一自我鉴定范文
2013/12/27 职场文书
先进集体事迹材料范文
2014/12/25 职场文书
2015年民兵整组工作总结
2015/07/24 职场文书
法制教育主题班会
2015/08/13 职场文书
保护环境建议书作文400字
2015/09/14 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
JavaScript数组 几个常用方法总结
2021/11/11 Javascript
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
mapstruct的用法之qualifiedByName示例详解
2022/04/06 Java/Android
详解Python中*args和**kwargs的使用
2022/04/07 Python
pt-archiver 主键自增
2022/04/26 MySQL
浅谈css清除浮动(clearfix和clear)的用法
2023/05/21 HTML / CSS