Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 查询字符串唯一字符串生成器?_C#_Asp.net_Security_Url_Query String - Fatal编程技术网

C# 查询字符串唯一字符串生成器?

C# 查询字符串唯一字符串生成器?,c#,asp.net,security,url,query-string,C#,Asp.net,Security,Url,Query String,关于:随机查询字符串/URL是如何生成的 在很多地方都可以找到: http://www.youtube.com/watch?v=IMl7pvaWzh8 ^ | +---------------- http://jsfiddle.net/xeolabs/LSTKM/light/

关于:随机查询字符串/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/JSFIDLE每天如何处理数百万个请求。

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

Guid.NewGuid().ToString()

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

大胆思考,但您可以预先计算一个巨大的独特哈希列表,并将其分配给任何新的输入。预先计算将确保您可以不断检查冲突,因为这不是实时需要的。您可以在中查看生成随机哈希。

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

string randomString = System.IO.Path.GetFileNameWithoutExtension(System.IO.Path.GetRandomFileName());
返回类似“jdvpmpre”的内容

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

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

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

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

以36为基数的注释:我们在日常操作中使用十进制系统,由10位数字组成。我们在计算机中使用十六进制数字,由16位数字(0-9加上A、B、C、D、E和F)生成现在也有了一个36进制的系统,它是用36位数字生成的;0-9和a-Z,所有数字都是字母数字。因此可以很容易地在URL中使用。维基百科页面上的一个例子:282110907456十进制将是36进制中的CRE66I9S。

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

(1) 这就是场景。db以值为1的令牌开始。
(2) Israel站点要求db获取一些新令牌,db将为其提供1-1000的范围(不是令牌,而是范围)。这样,Israel站点就不必为每个新请求返回db,直到它用完所有1000个令牌。
(3) 美国网站访问db,获得1001-2000范围的代币。
(4) 在我们的示例中,您有2个消费者和1个生产者(db)。假设您希望尽可能少地使用您的db,以避免阻塞其他消费者。因此,如果每个制作人花1秒的时间去db,那么db应该给每个消费者多少ID。答案是消费者使用的ID数量/1秒*消费者数量。这样消费者就不会死锁地等待db免费

那么,这些生产者如何利用这个范围呢?他们可以通过增加一个计数器来为他们从db接收到的范围生成72个基本标记。为什么是72个?因为这给了一个大数字一个短标记。为了得到72个,我在0-9键上使用了a-z,a-z,0-9,特殊字符:25+25+10+10。你可以超过72

会话令牌的实现位于:

还有一个问题可能会有所帮助:

您无法创建具有零冲突的哈希函数-除非您的哈希具有与实际数据相同的数据量,否则无法创建该函数。您可以对其进行哈希,但可能需要一些中央存储来消除歧义/etc.@MarcGravel reserve什么?我可以保存序列号-是的。但我需要
IMl7pvaW的输入zh8
将生成我的
SGierk43
。即使我选择RGNCcryptoGenerator,我也不能确定只取前7个字节(并转换为字母)是唯一的。(还有谁说字符可以位于查询字符串中?-正如你所知,并非所有字符都可以)我的意思是:尝试使用任意方法对
IMl7pvaWzh8
进行散列;然后说你得到了
SGierk43
——你可能需要检查
SGierk43
是否在使用中,如果是,则重新散列(使用其他因素)以获得一个新值(冲洗、重复等)你需要一个查找
SGierk43
(或其他什么)让你回到原来的
IMl7pvaWzh8
@marcgravel你是在告诉我,每次谷歌上传一个新视频并有一个新的查询字符串时,谷歌都会扫描它的数据库,看看它是否免费吗?(在我之前的评论中,我指的是RNGCryptoServiceProvider)@MarcGravel你能回答我最后的评论吗?我知道它是如何与RGNCCryptoServiceProvider(我已经提到过)一起使用的。而且-它不是以
f(n+1)=f(n)+1
的形式出现的