生成唯一的8字符十六进制字符串

时间:2011-04-28 02:45:39

标签: php mysql

就像一个有趣的项目一样,我想尝试为自己的个人用途制作一个简单的URL缩短器,但我想尝试将我喜欢的东西包含在其他缩短器中,例如bit.ly等。因此,在分配短URL ID方面,我遇到了麻烦。

现在我只是手动分配代码,但我想自动化它。我可以通过分配递增ID来轻松实现(我认为这可以使用MySQL数据库上指定的自动增量值来完成,只需使用PHP的dechex()函数)但似乎其他缩短程序是随机的。

我知道我在数据库中没有获得荒谬的URL数量但我仍然希望保持流程的有效性,这使得创建随机唯一ID而不是在数据库中使用许多URL。我真的不知道如何制作一个系统来制作不会重复的ID并且运行缓慢。

3 个答案:

答案 0 :(得分:2)

请参阅:PHP short hash like URL-shortening websites以及您可能需要的答案:http://blog.kevburnsjr.com/php-unique-hash

第二个链接可能特别有用,只需对当前ID进行短时间哈希。

答案 1 :(得分:2)

使用其中一个常用哈希函数(如MD5或SHA-1)获取URL的哈希值,将其打印为十六进制格式,并取最后8个字符(或前8个字符)。这样做的好处是,您始终可以确定是否已提交URL。

答案 2 :(得分:0)

您始终可以生成随机ID,检查它们是否已被分配,并在不太可能发生的情况下绘制新的ID,而您已经使用了已经使用过的ID。查看它们是否已经分配的查找不应该非常慢,因为每当有人查询您的某个URL时,您都会这样做。

如果你想要随机的十六进制字符串,快速而肮脏的方法是生成一个随机的大数字,使用sha1或任何其他哈希函数对其进行哈希处理,并获取前8个字符。我不明白为什么你会想要十六进制而不是随机的base64,因为base64允许你将更多的URL打包成更少的字符。 [实际上,您可能希望通过散列URL来生成ID - 如果使用安全加密散列,则应该像散列随机值一样好,并且它将确保相同的URL始终获得相同的密钥,从而防止重复。] < / p>

一旦达到预定义的数字(或者经常发生碰撞),不要忘记开始生成更长的ID,因为你不希望因为你的ID用完而导致很多事情变得很慢。

如果你想要对碰撞概率和所有这些东西有很好的理论保证,那么它有很多,取决于你使用的散列方案。

哦,只是在旁注,确实有一些使用顺序ID的URL缩短程序,如http://lilurl.sourceforge.net/。我认为通常避免的主要原因是阻止具有良好时机感的人将攻击性ID与他们选择的URL相关联......

相关问题