【问题标题】:Auto Increase Letters/Numbers like INT [closed]自动增加字母/数字,如 INT [关闭]
【发布时间】:2013-02-11 21:17:41
【问题描述】:

我需要一个函数来为数据库的每个输入增加“LETTER/NUMBER”。 就像处理 INT 数据的 AI。

我需要这个来制作一个短链接代码,比如site.com/1gHrT。

任何想法如何制作这个?

【问题讨论】:

  • 这看起来不像增量字符串,这看起来像是某种随机字符串。
  • 1gHrT 之后是什么? 1gHrU?字符串不应该是随机的吗?

标签: php mysql auto-increment


【解决方案1】:

URL 缩短器通常在 base62 中使用大整数。

整数通常在 base10 中(这是 十进制系统的另一个词,即[0-9])。还有其他常见的系统,比如base2([0-1])、base8([0-8])和base16([0-f])。

当您超过 base10 时,习惯上使用英文小写字母 ([a-z])。所以,base16 是[0-9a-f] (0123456789abcdef)。如果您将基数推到超出数字和小写字母可以处理的范围,那么您通常使用大写字母 ([A-Z])。所以,base62 使用[0-9a-zA-Z]。

在 PHP 中,base_convert() 函数可以处理从 base2 到 base36(或 [0-1] 到 [0-9a-z])的任何内容。

如果你想超越base36,那么你需要gmp 扩展名can handle anything up to base62。如果您没有安装gmp 扩展,那么您应该可以在互联网上使用find a function somewhere。此外,虽然base64_encode() 函数听起来可能相关,但在这种情况下并非如此。它对数据进行编码,这与更改基数(或radix)不同。

不过,您需要记住,base62 在网络上可能有点脆弱。这是因为小写和大写字母都有意义。换句话说,如果某个聪明人或女孩更喜欢小写 URI,并将其转换为小写,那么 URI 将指向错误的位置。从这个意义上说,base36 更安全,但 URI 不会那么短(虽然不会那么短)。

现在,如果您想增加帖子中的数字,只需将其转换为 base10,增加它,然后再转换回来。

如果我们假设它确实是在 base62 中,那么我们可以使用 gmp 函数:

function base62_increment($number, $incrBy = 1) {
    if ( ! defined('GMP_VERSION'))
        throw new \Exception(__FUNCTION__.' needs the GMP extension');
    $number = gmp_init($number, 62);
    $number = gmp_add($number, $incrBy);
    return gmp_strval($number, 62);
}
$base62 = '1gHrT';
$incremented = base62_increment($base62);
var_dump($base62, $incremented);

如果你想使用base36,或者如果你没有安装gmp扩展,那么我们可以使用base_convert():

function base36_increment($number, $incrBy = 1) {
    $number = base_convert($number, 36, 10);
    $number += $incrBy;
    return base_convert($number, 10, 36);
}
$base36 = 'esq2f';
$incremented = base36_increment($base36);
var_dump($base36, $incremented);

就是这样。

【讨论】:

    【解决方案2】:

    也许你在追求类似的东西?

    function randLetter()
    {
    return chr(97 + mt_rand(0, 25));
    }
    

    来源:http://maymay.net/blog/2004/12/19/generating-random-letters-in-php/

    【讨论】:

      【解决方案3】:

      您可以使用给定的字符将数字转换为字符串,就像您使用以下算法将一个系统中的数字转换为另一个系统一样

      $n = 123; //your number
      
      $chars = "abcdefghijklmnopqrstuvwxyz";
      $chars = "0123456789" . strtoupper($chars) . $chars;
      $b = strlen($chars);
      $nums = array();
      while ($n > 0) {
          $nums[] = $n % $b;
          $n = (int)($n / $b);
      }
      
      $nums = array_reverse($nums);
      $out = "";
      foreach ($nums as $num) {
          $out .= $chars[$num];
      }
      

      您可以在内部使用数字计数器,并使用此算法生成输出..

      【讨论】:

        【解决方案4】:

        未经测试,可能会进行优化以避免转换,但这会将数字转换为数字,但这会将顺序整数转换为字符串。

        $startval = 12435;
        $maxval = 12654;
        
        for ($i = $startval; $i < maxval; $i++) {
            $strINT = strval($i); // convert int to string
            // intialize final string to empty
            $strOutput = '';
            /* Loop through each letter */
            foreach (explode($strINT) as $letter) {
                // add 65 to each letter and turn it into a letter
                // letter A is character 65
                $strOutput .= chr(intval($letter) + 65);
            }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-05-04
          • 2019-02-27
          • 1970-01-01
          • 2011-07-21
          • 1970-01-01
          • 2020-09-04
          • 1970-01-01
          • 2015-06-23
          相关资源
          最近更新 更多