我想创建一个URL缩短服务,您可以在其中将长URL写入输入字段,该服务将URL缩短为" http://www.example.org/abcdef
".
而不是" abcdef
"可以有任何其他六个字符包含的字符串a-z, A-Z and 0-9
.这使得56到570亿个可能的字符串.
我的方法:
我有一个包含三列的数据库表:
然后我会将长URL插入表中.然后我会选择" id
" 的自动增量值并构建它的哈希值.然后应该将此哈希插入为" short
".但是我应该构建什么样的哈希?像MD5这样的散列算法会创建太长的字符串.我想,我不使用这些算法.自建算法也可以工作.
我的想法:
对于" http://www.google.de/
"我得到自动增量ID 239472
.然后我执行以下步骤:
short = '';
if divisible by 2, add "a"+the result to short
if divisible by 3, add "b"+the result to short
... until I have divisors for a-z and A-Z.
Run Code Online (Sandbox Code Playgroud)
这可以重复,直到数字不再可分.你认为这是一个好方法吗?你有更好的主意吗?
由于对该主题的持续兴趣,我发布了一个有效的GitHub解决方案,包括JavaScript,PHP,Python和Java的实现.如果你愿意,可以添加你的解
关于URL缩短器以及互联网上其他地方的stackoverflow,这里有很多问题,例如
http://www.codinghorror.com/blog/2007/08/url-shortening-hashes-in-practice.html
但是,有一件事我不明白.例如,http://goo.gl目前使用四个字符.但是,他们声称他们的短网址不会过期.正如关于编码恐怖的文章所述,如果他们无法回收URL,唯一可能的解决方案是在某一点上添加一个额外的角色.
好的,到目前为止一切顺利.4个字符表示大约1500万个唯一地址.对于像谷歌地图这样的东西,我认为这不是很多,如果你不能回收,我猜他们很快就用完了可用的地址.
现在对于我没有得到的部分.在分发地址时,它们开始耗尽未使用的地址.他们必须检查是否尚未发布新生成的地址.这种情况发生的可能性和地址已经在使用中增加了.当然,直接的解决方案是一遍又一遍地生成一个新的URL,直到他们找到一个免费的URL,或直到他们生成了所有150万个替代品.然而,这肯定不是他们实际上如何做到这一点,因为这将是非常耗时的.那么他们如何管理呢?
此外,可能有几个访问者同时要求一个简短的URL,因此他们也必须进行一些同步.但是当需要添加第五个角色时应该如何管理这种情况?
最后,在对http://goo.gl中的URL如何工作进行一些研究时,我当然多次在Google地图上为地图请求了一个简短的URL.它们都不会被使用.但是,当Google严格执行一旦发布的URL未到期的策略时,这意味着系统中存在大量的休眠URL.我再次假设谷歌(以及其他服务)也提出了解决这个问题的方法.我可以设想一个清理服务,它可以回收创建后48小时内未访问过的URL,或者在第一周内回收不到10次的URL.我希望有人也能对这个问题有所了解.
简而言之,我得到了URL缩短器的一般原则,但是当这些URL无法过期时,我发现了几个问题.有谁知道上面提到的问题是如何解决的,还有其他问题吗?
编辑
好吧,所以这篇博客文章揭示了一些事情.这些服务不会随机生成任何内容.它们依赖于底层数据库的自动增量功能,并对结果id应用简单转换.这消除了检查id是否已经存在(它没有)并且数据库处理同步的需要.这仍然使我的三个问题中的一个没有答案.这些服务如何"知道"链接是否在创建后实际使用?