2011-04-28 81 views
3

就像一个有趣的项目,我想尝试和为我自己的个人使用做一个简单的URL缩写,但我想尝试并结合我喜欢的其他shorteners喜欢bit.ly和这样的东西。所以,当谈到分配短网址ID时,我遇到了一些问题。生成独特的8字符Hex字符串

现在我只是手动分配代码,但我想自动化它。我可以通过简单的方式分配增量ID(我认为这可以通过在MySQL数据库上使用指定的自动增量值完成,并且只使用URL的PHP​​ dechex()函数),但似乎其他缩略符是随机的。

我知道我不会在数据库中获得荒谬的URL数量,但我仍然希望保持高效的流程,这使得创建随机唯一的ID而非数据库中的许多URL会造成负担。我真的不知道如何去做一个系统来制作不会重复的ID,也不会运行缓慢。

回答

2

见:PHP short hash like URL-shortening websites,答案你可能想:http://blog.kevburnsjr.com/php-unique-hash

第二个链接可能特别有用,只是短暂散列当前ID。

+0

我喜欢这种方法,现在你和@ a3_nm已经说服了我。当然,它可能不是随机的,可能不是8个字符,但我认为我已经认识到系统将具有的一些限制以及它实际上只是一个有趣的项目。感谢你们的帮助,我将使用Base36或Base64系统来生成我的代码。 – 2011-04-28 04:13:41

0

您可以随时生成随机ID,检查它们是否已被分配,并在不太可能发生的情况下画出一个新的ID,然后点击已经使用过的ID。查看它们是否已被分配不应该很慢,因为无论如何,每当有人查询您的某个网址时,您都会这样做。

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

不要忘记,一旦你点击一个预定义的号码(或者经常碰撞),就会开始生成更长的ID,因为当你用完ID并且发生大量冲突时,你不想让事情变得缓慢。

如果你需要关于碰撞概率和所有这些东西的很好的理论保证,这里有很多,取决于你使用的哈希方案。

哦,只是在一个侧面说明中,确实存在一些使用顺序ID的URL缩写,如http://lilurl.sourceforge.net/。我认为,它通常是可以避免的主要原因是为了防止人们时机感好进攻ID,以自己选择的网址,联系起来......

+0

是的,我认为这样做的重绘方式会没事,直到有人指出与大量的条目进行比较的问题。 – 2011-04-28 03:25:38

1

使用常见散列函数之一(如MD5或SHA-1)获取URL的散列值,将其打印为十六进制格式,并取最后8个字符(或前8个字符)。这具有可以随时确定URL是否已被提交的优点。

+0

这是我遇到的第一个解决方案之一,但问题是,没有任何方法可以确保我选择的8个字符是唯一的,只有完整的散列才是唯一的。 – 2011-04-28 03:20:06

+0

你甚至不能保证完整的哈希将是唯一的,但对于所有的实际目的来说,它足够接近。如果前8个字符的实际用途不够密切(我认为它是很多其他软件使用它作为完整散列的便捷唯一缩写),那么您想要提供确定性的方式来将哈希修改为后备(可能需要从完整哈希中取8个字符的不同窗口)。 – 2011-04-28 03:28:44

+0

是的,我猜你是对的。最后,我想我想保证安全,并确保没有任何碰撞。感谢您的洞察力。 – 2011-04-28 04:05:34