2

我已经阅读了大约 5-10 篇关于这个主题的不同帖子,但没有一个给出明确的例子。他们解释了背景故事。

  1. 我有一个 MySQL 数据库,记录从“1”到“500000”
  2. 我希望 URLS 基于这些记录 ID 号
  3. 我希望 URL 保持在 3-5 个数字之间

例子:

http://wwwurl.com/1将 再次 是http://wwwurl.com/ASd234s http://wwwurl.com/5000000将是http://wwwurl.com/Y2v0R4r

我可以得到一个清晰的功能代码示例来完成这项工作,谢谢。

4

2 回答 2

0

要将 id 号减少到较短的字符串,请转换为 base 35....

 $short_id=base_convert($id, 10, 35);

如果您想让预测序列变得更加困难,请将其填充并使用已知字符串进行异或:

 function shortcode($id)
 {
   $short_id=str_pad($short_id, 4, '0', STR_PAD_LEFT);
   $final='';
   $key='a59t'; // 500000 = 'bn5p'
   for ($x=0; $x<strlen($short_id); $x++) {
     $final=chr('0') | (ord(substr($short_id, $x, 1)) ^ ord(substr($key, $x, 1));
   }
   return $final;
 }

要取回原始 ID,只需反转该过程即可。

于 2012-04-24T12:08:12.463 回答
0

一个非常愚蠢的例子 - 使用 eg substr(md5($id), 10, 15),其中 $id 是您的 1-500000 记录 ID 号。在 32 个字符的哈希码中,在位置 10 和 15(但您也可以使用位置 24-28 等)之间生成相同哈希的概率限制为零......

最好将映射 ID <-> HASH 保存到数据库表中,以便根据 URL 轻松找到相关记录。

完整的源代码——哈希创建、URL 重写、映射保存和基于 URL 的记录检索是一个非常复杂的问题,可以在数千种变体中实现,主要取决于程序员的技能、经验以及他正在实现的系统。 ..

于 2012-04-24T10:03:27.937 回答