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每天有数百万次请求。
答案 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?