在PHP中为设置长度URL缩短设计一个好的哈希函数

时间:2010-11-23 22:42:26

标签: php url string hash

我正在开发一个URL缩短器。输入是一个URL,输出需要是一个4个字符的字符串(字母数字,区分大小写)。

我计算出如果我使用带有区分大小写的字母数字键空间的4个字符,我应该能够存储64 ^ 4(16777216)个URL,直到我的空间不足为止。

我也不希望我的URL缩短器生成任何令人反感的四字母单词的短URL。如果有人制作了一个域名为domain.com/f**k的短网址,那将是不幸的。你得到了照片......

关于最佳方式的任何想法?我觉得我将在这个过程中的某个地方使用base64_encode。

2 个答案:

答案 0 :(得分:3)

如果我是你,我会制作一个区分大小写的字母数字增量器。只需递增,并将数字分配给数据库行。要检查坏词,只需检查黑名单。如果它通过,很好。如果没有,只需再次增加。

这样,它们只是按顺序而不是哈希算法。前几个看起来像这样:

id   | url
-------------------------
0000 | http://google.com
0001 | http://yahoo.com
0002 | http://example.com
...
000a | http://mail.google.com
000b | http://adobe.com
...
000A | http://microsof.com
...
0010 | http://w3.org
...
00a0 | http://youtube.com
...
00A0 | http://stackoverflow.com

等等。

以下是该功能如何工作的提示: http://us3.php.net/manual/en/function.ord.php

顺便说一句,我的数学可能不对,但我认为是(10 + 26 + 26)^ 4 = 14776336

编辑:为了好玩和挑战,我写了一个增量函数。达到最大值时,它返回false,因此在使用它时只需将其与false(使用===)进行比较。

http://pastebin.com/957KPn4p

答案 1 :(得分:1)

它模糊地提醒我这个How do I create unique IDs, like YouTube?。您必须确保(在更有限的空间内)检查碰撞的可能性。