php - URL 缩短器算法

标签 php database performance algorithm url-shortener

我最近为自己购买了一个用于缩短个人 URL 的域名。 我创建了一个函数来生成 4 个字符的字母数字字符串作为引用。

但是

如何检查它们是否已被使用?我无法检查数据库中是否存在每个 URL,或者这只是它的工作方式,我必须这样做吗? 如果是这样,如果我生成了 13.000.000 个 URL(共 14.776.336 个)怎么办?我是否需要一直生成字符串,直到找到数据库中还没有的字符串?

这看起来不正确,谁能给我一些建议?

最佳答案

我想到的一种内存效率高且速度更快的方法如下。根本不用数据库就可以解决这个问题。这个想法是,您可以将它们存储在内存中,而不是将使用过的 url 存储在数据库中。由于将它们存储在内存中会占用大量内存,因此我们将使用一个位集(位数组)并且每个 url 只使用一位。

  1. 对于您生成的每个随机字符串,为位于 b/w 0 和最大数字 K 的那个创建一个哈希码。
  2. 创建一个位集(基本上是一个位数组)。每当你使用一些 url 时,将位设置中相应的哈希码位设置为 1。
  3. 每当你生成一个新的 url 时,看看它的 hashcode 位是否被设置。如果是,则丢弃该 url 并生成一个新的 url。重复这个过程,直到你得到一个未使用的。

这样你就永远避免了数据库,你的查找速度非常快,而且占用的内存最少。

我借用了this place的想法

关于php - URL 缩短器算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10227772/

相关文章:

php - PHP套接字编程socket_read + socket_write()

php - 在字符串上调用成员函数redirect() - Yii2 v2.0.36

database - 使用 Visual Studio 2010 Access 2010 数据库

sql-server - 在数据库中存储密码的首选方法

c++ - 使用 __builtin_expect() 或 Linux 内核时 "very likely"的可能性和可能性是多少

php - 如何将 $request 添加到构造方法中?

php - 将 Mysql 附近查询转换为 Laravel API 查询

database - Postgresql - 使用 x 表转储数据库 - 仅模式但来自一个表的数据

python-3.x - Python实现BFS解决8个难题需要很长时间才能找到解决方案

performance - SSL 速度 - 特定于 Magento