我正在构建一个新的 Web 应用程序,该应用程序需要生成一个内部短 URL,以便将来使用,以便用户轻松返回具有很长 URL 的特定页面。我最初的想法是将一个数字存储在数据库中并以十六进制值输出,以使其比整数短。TinyURL.com 似乎使用了 HEXADECIMAL 以外的东西(多个大小写字母与数字混合)。有没有一种简单的方法来生成类似于 TinyURL 的东西?
5 回答
请查看这个关于主题的很好的解释:随机 TinyURL 浏览器(更新)。
重要部分:
正如我们所建立的,TinyURL 有 62,193,780 个可能的值。TinyURL 由 Base 36 哈希生成(36 表示字符 az 和 0-9 的数量,可以从中构造 TinyURL 的可能值数组),由 MySQL 自动递增,初始值计数为零。
顺便说一句,另一个类似的问题,通过数学观点:创建自己的 Tinyurl 样式 uid。这里有一些 .NET 源代码:Base 36 type for .NET (C#)
它们使用 base 36 编码,您可以通过使用 base 64 使您的应用程序更加健壮。
这是我在 Python 中尝试的(我确实看到了你的语言标签,请原谅我):
#!/usr/bin/python
from base64 import b64encode
from hashlib import sha1
for i in range(5):
salted_int = "<salt>%s</salt>" % i
print b64encode(sha1(salted_int).hexdigest())[:6]
输出:
NTUwMz
ZTVmZD
OGEzNm
Njc2MT
YzVkNj
因此,您可以自动递增一个整数并将其提供给类似这样的某种函数,最终很有可能得到一组随机字符串。另请参阅我对这个问题的回答。一些 base64 实现可能会发出斜线/
或加号+
,因此您应该在实现中留意这些,因为它们在 URL 中很危险。
哈希非常灵活,可以防止您的用户猜测下一个 URL(如果这对您很重要)。
另一个供您研究的 asp.net 开源: mini url
我最近在 codeplex for sharepoint 上看到了类似的东西,他们似乎使用十六进制数字作为 url 缩短器。可能值得看看他们是如何在这里做的http://surlshortener.codeplex.com/
我最初的想法是在数据库中存储一个数字并将其输出为 HEXADECIMAL 值以使其短于整数。
保持比整数短的东西有什么意义?
所以你想有这样的 URL:http://here.there/ 12D687而不是http://here.there/ 1234567?
如果你问我哪一个对我来说更容易,我会告诉后一个。
但老实说,我没有看到我的例子中的重点,因为两者几乎相同。
有没有一种简单的方法来生成类似于 TinyURL 的东西?
是的。要求用户提供。
如果不可能,只需使用普通整数 id。有什么可以更容易...