【问题标题】:Generating Unique 8 Character Hex Strings生成唯一的 8 个字符的十六进制字符串
【发布时间】:2011-08-14 08:33:40
【问题描述】:

作为一个有趣的项目,我想尝试制作一个简单的 URL 缩短器供我自己使用,但我想尝试合并我喜欢的其他缩短器(如 bit.ly 等)中的东西。因此,在分配短 URL ID 时,我遇到了麻烦。

现在我只是手动分配代码,但我想自动化它。我可以通过分配递增的 ID 来轻松地做到这一点(我认为这可以使用 MySQL 数据库上分配的自动递增值来完成,只需对 URL 使用 PHP dechex() 函数)但似乎其他缩短器是随机的.

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

【问题讨论】:

标签: php mysql


【解决方案1】:

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

第二个链接可能特别有用,只是对当前 ID 进行短哈希处理。

【讨论】:

  • 我喜欢这种方法,因为您和@a3_nm 已经说服了我。当然,它可能不是随机的,也可能不是 8 个字符,但我想我已经接受了系统将具有的一些限制以及它实际上只是一个有趣的项目这一事实。感谢大家的帮助,我将使用 Base36 或 Base64 系统来生成我的代码。
【解决方案2】:

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

【讨论】:

  • 这是我遇到的第一个解决方案之一,但问题是没有任何方法可以确保我选择的这 8 个字符是唯一的,只有完整的哈希是唯一的.
  • 你甚至不能保证完整的哈希值是唯一的,但对于所有实际目的来说它已经足够接近了。如果前 8 个字符对于实际用途而言不够接近唯一(我认为是——许多其他软件将其用作完整哈希的方便唯一缩写),那么您想提出一种确定性的方法来将散列修改为备用(可能从完整散列中获取 8 个字符的不同窗口)。
  • 是的,我想你是对的。最后,我想我想要安全并确保根本没有碰撞。不过感谢您的洞察力。
  • 如果你要那样做,你不妨只使用 crc32 - 它自然有 8 个字符。好吧,至少如果你使用类似 php.net/manual/en/function.crc32.php#93797 的东西。
【解决方案3】:

您始终可以生成随机 ID,检查它们是否已被分配,并在万一遇到已使用的 ID 时绘制一个新 ID。查找它们是否已被分配应该不会很慢,因为无论如何每次有人查询您的 URL 时您都会这样做。

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

一旦您达到预定义的数字(或经常发生碰撞),不要忘记开始生成更长的 ID,因为您不希望在用完 ID 并发生大量碰撞时让事情变慢。

如果您想要关于碰撞概率和所有这类东西的良好理论保证,有很多,具体取决于您使用的散列方案。

哦,顺便说一句,确实有一些使用顺序 ID 的 URL 缩短器,例如 http://lilurl.sourceforge.net/。我认为通常避免使用它的主要原因是防止具有良好时机意识的人将攻击性 ID 与他们选择的 URL 相关联...

【讨论】:

  • 是的,我认为在有人指出要比较的条目数量较多的问题之前,以重绘方式进行操作是可以的。
猜你喜欢
  • 2020-11-13
  • 2018-03-12
  • 1970-01-01
  • 2016-06-16
  • 2017-01-01
  • 1970-01-01
  • 2021-07-07
  • 2014-03-07
  • 2010-10-04
相关资源
最近更新 更多