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

标签 php url string hash

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

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

我也不希望我的 URL 缩短器生成任何具有冒犯性的四个字母单词的短 URL。如果有人制作了 domain.com/f**k 的短 URL,那将是不幸的。你明白了……

关于解决此问题的最佳方法有什么想法吗?我觉得我会在这个过程中的某个地方使用 base64_encode。

最佳答案

如果我是你,我会制作一个区分大小写的字母数字增量。只需递增,并将数字分配给数据库行。要检查坏词,只需检查黑名单即可。如果它通过了,那太好了。如果不是,则再次递增。

这样,它们就不是哈希算法,而是有序的。前几个看起来像这样:

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

关于php - 在 PHP 中为设置长度 URL 缩短设计一个好的哈希函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4261759/

相关文章:

php - CakePHP 3 : How to display associated data for each record in index. CTP?

javascript - JQuery 在 Internet Explorer 11 下无法使用计算机名称

c# - 从字符串中获取删除的字符

java - 使用 URL java 连接到 localhost 时出错

xml - 使用 Ant 解析 XML 文档中的字符串

java - char 数组值未更改为大写

php - 合并两个数组,当前导子字符串相同时用第二个数组值覆盖第一个数组值

php - 从两个已知词生成随机词

php - 我将如何构建一个像这样工作的简单 php 钩子(Hook)系统?

php - htaccess 规则不适用于本地主机