7

一旦我问过:显然随机查询字符串/url是如何生成的。

它可以在很多地方找到:

http://www.youtube.com/watch?v=IMl7pvaWzh8
                                   ^
                                   |
                                   +---------------- 

http://jsfiddle.net/xeolabs/LSTKM/light/
                              ^
                              |
                              +---------------- 

http://jsbin.com/asapay/1/edit
                   ^
                   |
                   +---------------- 

有人告诉我(这似乎是逻辑),当服务器选择一个新的 url 时,它不会检查它是否是免费的(之前没有选择过)

另外,有人告诉我它可能是以下公式的结果:( f(n+1) = f(n)+1所以它根本不是随机的。

所以新的 url 参数是最后生成的 url 参数的结果。

我的问题 :

我在哪里可以找到这样的生成器功能?

当然,我可以构建自己的 17=16+1,但我正在寻找类似的东西:

f(n+1) = f(n)+1其中有大写,小写,数字的用法。
当然还有最小碰撞和零预测

你知道的,一些专业的东西......

我只是好奇 google/youtube/jsbin/jsfiddle 是如何处理每天数百万个请求的。

4

5 回答 5

2

大声思考,但您可以预先计算一个巨大的唯一哈希列表并将它们分配给任何新输入。预先计算将确保您可以继续检查碰撞,因为它不需要实时。您可以查看在这个问题中生成随机散列。

于 2012-12-23T20:35:54.730 回答
0

继续我的评论,
假设您有几个位置正在接受输入并生成唯一令牌,我说您可以划分范围。例如,假设您在以色列有一个站点,在美国有一个站点,并且您希望两者都生成唯一的令牌(您不希望在这些站点生成的令牌之间有任何重叠),您可以使用唯一的数据库来存储当前代币价值。

(1) 这是情景。db 以值为 1 的令牌开头。
(2)以色列站点要求 db 获取一些新令牌,db 将给它从 1-1000 的范围(不是令牌,而是范围)。这样,以色列站点不必为它收到的每个新请求返回数据库,直到它用完所有这 1000 个令牌。
(3)美国站点进入数据库并获得 1001-2000 范围的令牌。
(4) 在我们的示例中,您有 2 个消费者和 1 个生产者(数据库)。假设是您希望尽可能少地使用您的数据库,以免阻止其他消费者。因此,如果每个生产者需要 1 秒去 db,那么 db 应该给每个消费者多少个 ID。答案是消费者使用的 ID 数量/1 秒 * 消费者数量。这样,消费者就不会陷入僵局,彼此等待数据库空闲。

那么这些生产商是如何利用这个范围的呢?他们可以通过增加一个计数器来为他们从 db 接收到的范围生成 base 72 令牌。为什么基数为 72?因为这为大量数字提供了一个简短的标记。为了得出 72,我在 0-9 键上使用了 az、AZ、0-9,特殊字符:25+25+10+10。你可以超过72。

会话令牌的实现位于:
https ://github.com/hoytech/Session-Token

还有这个问题可能会有所帮助:
如何生成随机字母数字字符串?

于 2012-12-23T21:38:20.053 回答
0

这不能完全回答您的具体问题,但如果您需要一个返回唯一且不可预测的字符串的函数,那么有一个:

Guid.NewGuid().ToString()

我经常使用它在各种场景中形成唯一的查询字符串。

于 2012-12-23T20:34:23.203 回答
0

一种解决方案(我自己使用过)可能是这样的:

要求:增加序列号的唯一源(如 Oracle 中的序列或 SQL Server 中的自动增量索引等) - 您可以可靠地处理以生成此类增量源的任何内容。

生成每个新 URL(或任何您需要的 URL)的工作流程: 1 - 获取序列的下一个值。2 - 将其转换为基数 36数字(您可以通过谷歌搜索它在 C# 中的实现,例如这个)。3 - 在你的 URL 中使用生成的 base 36 数字(或者你正在做的任何事情,比如修改数据库等)。

关于 36 进制数的注意事项:我们在日常操作中使用十进制系统,由 10 位数字组成。我们在计算机中使用由 16 位数字(0-9 加上 A、B、C、D、E 和 F)产生的十六进制数字。现在也有一个base 36系统,是用36位生成的;0-9 和 AZ 以及所有数字都是字母数字。因此可以在 URL 中轻松使用。来自 Wikipedia 页面的示例:2,821,109,907,456 十进制将是基数 36 的 CRE66I9S。

于 2012-12-23T21:32:55.587 回答
0

System.IO有一个随机文件名生成器,也许你可以劫持它。

string randomString = System.IO.Path.GetFileNameWithoutExtension(System.IO.Path.GetRandomFileName());

返回类似“jdvpmpre”的东西

您可以将几个组合在一起以使其更加独特,但这将是一个快速简单的解决方案。

于 2012-12-23T20:46:16.043 回答