检查我之前生成的随机字符串之前没有生成的最快方法是什么?

时间:2013-11-24 19:02:55

标签: javascript algorithm

我很好奇imgur这样的地方(通过一个独特的5位数字标识每个图像)如何实现这一点。显然,一个人至少会有一个O(n)解决方案(或者最好O(n log (n)),具体取决于算法),但由于我期望n为数百万,所以这将是一个不可行的解决方案。

4 个答案:

答案 0 :(得分:5)

imgur最有可能在数据库中使用“自动编号”主键。这种钥匙中的数字保证是唯一的;它们按顺序分配,永远不会被重用(即使它们识别的记录已被删除)。

您可以根据自己喜欢的方式查看这些数字,包括imgur使用的字母数字组合。一种方法是使用base 36 encoder,对于数字12345678,将返回

7CLZI

在Javascript中很容易做到:

(1234567890).toString(36)  // => "kf12oi"
parseInt("kf12oi",36) // => 1234567890

尽管您很可能会在服务器上进行这些转换,而不是在浏览器中进行。

base58,会得到大写和小写字母以及数字:

15FsU

另见
http://convertxy.com/index.php/numberbases/

答案 1 :(得分:2)

您可以使用顺序数字键,然后使用multiplicative inverse对其进行转换。然后,base 64对其进行编码以获取您的字符串。

好的方面是恢复密钥很容易:基础64解码,再次进行乘法逆,你有密钥。

答案 2 :(得分:1)

这可以使用http://en.wikipedia.org/wiki/Bloom_filter来完成。这是一种非常有效的算法。它确实存在少量误报的缺点。

答案 3 :(得分:1)

我不确定我是否在这里有正确的结束,但假设你想生成一个随机字符串然后存储它以访问你只需要检查它是否在你的商店

如果您的SQL数据库表在字符串上有唯一索引,则可以尝试插入。如果插入因重复的唯一键而失败,则表示您已使用它。这几乎是即时的。