Query String唯一字符串生成器?

时间:2012-12-23 20:11:26

标签: c# asp.net security url query-string

Once I've asked关于:显然是随机查询字符串/网址是如何生成的。

它可以在很多地方找到:

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

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

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

我被告知(似乎逻辑)当服务器选择一个新网址时,它不会检查它是否空闲(以前没有选择)

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

所以新的url param是由最后生成的url param生成的。

我的问题:

我在哪里可以找到这样的发电机功能?

当然我可以建立一个我自己的17 = 16 + 1,但我正在寻找 ready 之类的东西:

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

你知道,专业......

我很好奇google / youtube / jsbin / jsfiddle每天有数百万次请求。

5 个答案:

答案 0 :(得分:2)

大声思考,但你可以预先计算一大堆独特的哈希并将它们分配给任何新的输入。预先计算将确保您可以持续检查碰撞,因为它不是实时需要的。您可以在this question中查看生成随机哈希值。

答案 1 :(得分:0)

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

Guid.NewGuid().ToString()

我经常用它在各种情况下形成独特的查询字符串。

答案 2 :(得分:0)

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

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

返回类似“jdvpmpre”

的内容

你可以加入一对夫妇,使其更加独特,但这将是一个快速简单的解决方案。

答案 3 :(得分:0)

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

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

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

关于36号基数的注释:我们在日常操作中使用十进制,包括10位数。我们在计算机中使用六进制十进制数,它由16位数字组成(0-9加A,B,C,D,E和F)。现在还有一个基础36系统,它使用36位数产生; 0-9和A-Z以及所有数字都是字母数字。因此可以在URL中轻松使用。来自维基百科页面的例子:2,821,109,907,456十进制将是基数为36的CRE66I9。

答案 4 :(得分:0)

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

(1)这就是场景。 db以值为1的标记开始 (2)以色列网站要求数据库获得一些新的令牌,数据库将给出它的范围从1-1000(不是令牌,但范围)。这样,以色列站点不必返回每个新请求的数据库,直到它耗尽所有这1000个令牌为止。
(3)美国站点进入数据库并获得1001-2000范围的令牌 (4)在我们的例子中,你有2个消费者和1个生产者(数据库)。假设您希望尽可能少地使用数据库来阻止其他消费者。因此,如果每个生产者花费1秒钟去db,那么db应该给每个消费者多少ID。答案是消费者使用的ID数量/ 1秒*消费者数量。这样,消费者就不会陷入僵局,等待数据库变得自由。

那么那些生产商如何利用这个范围呢?他们可以通过递增计数器为他们从db接收的范围生成基本72令牌。为什么基地72?因为这给了大量的短令牌。想出72我在0-9键上使用了a-z,A-Z,0-9,特殊字符:25 + 25 + 10 + 10。你可以超过72。

会话令牌的实现可在以下位置找到:
https://github.com/hoytech/Session-Token

还有一个问题可能会有所帮助:
How to generate a random alpha-numeric string?