如何创建尽可能短的URL唯一ID?

时间:2013-12-17 09:14:30

标签: php increment sequential

对于我的域名,我正在尝试开发一个ID生成器,它可以创建一个唯一的ID,然后可以用作短链接(就像URL缩短器一样)。

我考虑过使用md5()uniqueid()来创建该ID。但是为了保持URL尽可能短,这不会很聪明,因为它会传递大量的ID,因此字符串/ ID会变得更长而没有必要。

现在PHP's string incrementation提供了一种有趣的方式。我能做到:

$d = 'A08';
for ($n=0; $n<60; $n++) {
    echo ++$d . PHP_EOL;
}
// Outputs: A09 .. A68

但这只会给我A09A68的所有字符串。所以我设置$d = '000'以便从那里开始。但现在它只返回从160的整数,而不是字符串。

如何强制PHP从000通过AAA增加到ZZZ

可以这么说,我想要一个ID,而不是从09AZ以及az

0, 1, 2, .., 9, A, .., Z, a, .., z

然后第二个字符应添加到id:

00, 01, 02, .., 09, 0A, .., 0Z, 0a, .., 0z

3 个答案:

答案 0 :(得分:2)

我在http://filepublicator.com上做了类似的事情。我的解决方案是每个帖子都有自己唯一的增量ID(就像你通常给他们的那样:1,2,3等等),还有这个id的副本转换为base 62。

然后我使用这个base 62副本作为url。继承人关于此的另一个主题: converting a number base 10 to base 62 (a-zA-Z0-9)

我采用这种方法首先生成一个真实的id,然后将其转换为base 62,因为我知道我有一个唯一的id而没有对我已经存在的帖子进行测试,它很容易被翻译成我真实的id飞。

理论上有人可以很容易地弄清楚我创建网址的方法并尝试遍历我的所有网页,但是如果你正在寻找隐藏的帖子并且很难找到没有密码保护的短网址,那么就不用了。< / p>

这是Eineki在该主题中编写的方法:

function toBase($num, $b=62) {
  $base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $r = $num  % $b ;
  $res = $base[$r];
  $q = floor($num/$b);
  while ($q) {
    $r = $q % $b;
    $q =floor($q/$b);
    $res = $base[$r].$res;
  }
  return $res;
}

function to10( $num, $b=62) {
  $base='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
  $limit = strlen($num);
  $res=strpos($base,$num[0]);
  for($i=1;$i<$limit;$i++) {
    $res = $b * $res + strpos($base,$num[$i]);
  }
  return $res;
}

测试

for ($i = 0; $i<1000000; $i++) {
  $x =  toBase($i);
  $y =  to10($x);
  if ($i-$y)
    echo "\n$i -> $x -> $y";
}

答案 1 :(得分:1)

您可以按如下方式生成AAA - ZZZ:

for($key = 'AAA'; $key != 'ZZZ'; $key++) {
    echo $key;
}

希望我能正确理解你的问题。

修改

$last_key = 'ZZZ';
for($key = 1; $key != $last_key; $key++) {
    echo is_int($key) ? sprintf('%03d', $key) : $key;
    if($key == 999) { $key = 'AAA'; }
}

<强>输出:

001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
...
...
998
999

其次是

AAB
AAC
AAD
AAE
AAF
AAG
AAH
AAI
AAJ
AAK
AAL
AAM
AAN
AAO
AAP
AAQ
AAR
AAS
AAT
AAU
...
...
ZZX
ZZY

答案 2 :(得分:-1)

返回结果“a01” - “cw00”

<?php
   $d = 'a00';
   for ($n=0; $n < 10000; $n++) {
    echo ++$d . PHP_EOL;
   }
?>

不太确定这是否是你要找的......