1

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

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

这看起来不是正确的方法,任何人都可以给我一些建议吗?

4

3 回答 3

3

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

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

这样您就可以永远避免使用 DB,查找速度非常快,并且占用的内存最少。

我从这个地方借来的想法

于 2012-04-19T12:28:05.800 回答
0

一个折中的解决方案是生成一个随机id,如果已经在数据库中,就找第一个比它大的空id。(如果在上述范围内找不到任何空白区域,请绕行。)

如果您不希望 id 不可猜测(如果您只使用 4 个字符,则可能不会),这种方法可以正常工作并且速度很快。

于 2012-04-19T12:27:16.277 回答
0

一种算法是尝试几次找到N个字符的空闲url,如果仍然没有找到,则增加N。从N = 4开始。

于 2012-04-19T15:43:56.543 回答