【发布时间】:2014-09-19 04:20:59
【问题描述】:
我正在尝试找到一种将数据库 ID 编码为短 URL 的方法,例如1 应该变成“Ys47R”。然后我想将它从“Ys47R”解码回 1,这样我就可以使用 INT 值运行数据库搜索。它需要使用数据库ID 是唯一的。序列不应轻易猜到,例如 1 = "Ys47R", 2 = "Ys47S"。它应该类似于 YouTube 或 bitly 的 URL's。我已经阅读了数百个使用 md5、base32、base64 和 `bcpow 的不同来源,但都是空的。
This blog post 看起来很有希望,但是一旦我添加了填充和密码,短 ID,例如 1 变成了 SDDDG,2 变成了“SDDDH”,3 变成了“SDDDI”。这不是很随机。
base32 仅使用 a-b 0-9
base64 末尾有 == 等字符。
然后我尝试了这个:
function getRandomString($db, $length = 7) {
$validCharacters = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
$validCharNumber = strlen($validCharacters);
$result = "";
for ($i = 0; $i < $length; $i++) {
$index = mt_rand(0, $validCharNumber - 1);
$result .= $validCharacters[$index];
}
这很有效,但意味着我每次都必须运行数据库查询以确保没有冲突并且数据库中不存在冲突。
有没有一种方法可以创建简短的ID's,最少 4 个字符,[a-z][A-Z][0-9] 的字符集可以编码和解码回来,在每个数字都是唯一的数据库中使用增量唯一 ID。我无法理解使用base32 或base64 的高级技术。
或者我是否对此进行了太多研究,并且有更简单的方法可以做到这一点?最好是做上面的随机字符串函数,一直查询数据库检查唯一性吗?
【问题讨论】:
-
目的是什么?如果编码的数字不可预测,那么是的,您必须随机生成它们,检查是否存在并将它们存储在您的表实际
id键旁边。 -
目的是把 url 变成 bit.ly 类型的 url。因此,我可以使用 $_GET 参数来获取 id,将其转换回原始 int,以便我可以检查数据库他们所指的页面,以便我可以提取详细信息。因此,经过大量阅读后,我看到了两个选项,1 创建和检查 db,当创建大量页面时,也会增加发生冲突的机会,或者正如其他人提到的那样,像 youtube、bitly 和 using 那样即时创建它base64 表示创建时不对数据库进行检查,可以即时完成,每个数字都是唯一的,最多可达数十亿
-
主题明确。但是为什么要转换页面ID?它是否意味着伪安全功能?这基本上只是混淆。 (对于那个 base32 来说,通过添加一个基值来提高输出长度就足够了,再加上一些洗牌。)
-
没错,应该是更多的混淆,加上好看的url。一个例子是用户将向客户发送报告链接,因此看起来不错的短网址。同时,虽然不是机密和公共知识,但我不希望有人开始在 url 中从用户或客户端输入 id 号的 1、2、3、4 来查看其他人的工作,等等。
-
你能用 base64 减去 == 符号做洗牌位并将其解码回来吗?这是我在提到它时找到的链接,它没有说明他们如何使用 base64 创建 ID,但类似的概念是使用 $_get 获取唯一短网址 stackoverflow.com/questions/2308579/…