zoukankan      html  css  js  c++  java
  • PHP生成类似类似优酷、腾讯视频等其他视频链的ID

    不知道你注意了没有,类似优酷、腾讯视频等其他视频链接似乎类似这样的

    http://v.youku.com/v_show/id_XNjA5MjE5OTM2.html

    注意id_xxx那段,是不是看不懂了,但你无可否认这个就是id,这不国外的一位牛人早在09年就写了针对PHP/Python/Javascript/Java/SQL的生成方法,可见我现在是多么的落伍,下面我把代码贴出来,希望分享精神永存。

    PHP代码(Get from GitHub

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    <?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
     *
     * 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:
     *
     * if you really need this for bigger numbers you probably have to look
     * but I haven't really dugg into this. If you have more info on those
     * matters feel free to leave a comment.
     *
     * The following code block can be utilized by PEAR's Testing_DocTest
     * <code>
     * // Input //
     * $number_in = 2188847690240;
     * $alpha_in  = "SpQXn7Cb";
     *
     * // Execute //
     * $alpha_out  = alphaID($number_in, false, 8);
     * $number_out = alphaID($alpha_in, true, 8);
     *
     * if ($number_in != $number_out) {
     *    echo "Conversion failure, ".$alpha_in." returns ".$number_out." instead of the ";
     *    echo "desired: ".$number_in." ";
     * }
     * if ($alpha_in != $alpha_out) {
     *    echo "Conversion failure, ".$number_in." returns ".$alpha_out." instead of the ";
     *    echo "desired: ".$alpha_in." ";
     * }
     *
     * // Show //
     * echo $number_out." => ".$alpha_out." ";
     * echo $alpha_in." => ".$number_out." ";
     * echo alphaID(238328, false)." => ".alphaID(alphaID(238328, false), true)." ";
     *
     * // expects:
     * // 2188847690240 => SpQXn7Cb
     * // SpQXn7Cb => 2188847690240
     * // aaab => 238328
     *
     * </code>
     *
     * @author   Kevin van Zonneveld <kevin@vanzonneveld.net>
     * @author   Simon Franz
     * @author   Deadfish
     * @copyright 2008 Kevin van Zonneveld (http://kevin.vanzonneveld.net)
     * @version   SVN: Release: $Id: alphaID.inc.php 344 2009-06-10 17:43:59Z kevin $
     *
     * @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  < 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;
    }

    使用举例

    1
    2
    <?php
    alphaID(9007199254740989);

    执行结果将被返回“fE2XnNGpF”,我们可以把它认为是加密,进行反解密则

    1
    2
    <?php
    alphaID('fE2XnNGpF', true);

    那么就转换成真实的数字“9007199254740989”。方法还可以支持使用key进行加密,使得别人无法解得你真实的ID。

  • 相关阅读:
    洛谷P1455 搭配购买
    洛谷1341 无序字母对
    打击犯罪
    Cheese
    [noip2002] 产生数
    分治算法-----二分求最大最小
    yl 练习
    cj 练习
    雅礼2018-03-19洛谷作业 2
    雅礼2018-03-19洛谷作业
  • 原文地址:https://www.cnblogs.com/gredswsh/p/3347660.html
Copyright © 2011-2022 走看看