PHP实现把数字ID转字母ID

网络编程 2021-07-05 09:49www.168986.cn编程入门
以下是对使用PHP把数字ID转字母ID的实现代码进行了详细的分析介绍,需要的朋友可以过来参考下
ID是网站中经常出现的,它一般是数字,我们发现现在的网站很多ID都是字母了,比如YouTube的视频播放页它的URL类似/watch?v=yzNjIBEdyww。 狼蚁网站SEO优化是一个生成字母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./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 oupy 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./php/manual/en/ref.bc.php
  or: http://theserverpages./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 ment.
 
  @author  Kevin van Zonneveld <kevin@vanzonneveld.>
  @author  Simon Franz
  @author  Deadfish
  @copyright 2008 Kevin van Zonneveld (http://kevin.vanzonneveld.)
  @license   http://.opensource./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./
 
  @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./)
    // 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;
}

Copyright © 2016-2025 www.168986.cn 狼蚁网络 版权所有 Power by