使用Path.GetRandomFileName时可能发生冲突

时间:2017-02-11 14:41:15

标签: c# random statistics probability

Path.GetRandomFileName返回一个由11个随机字符组成的加密字符串。它由8个字符+点+ 3个字符组成,如:" b253i5vu.psf"。 char可以是小写字母或0到5之间的数字。因此可能的字符串数是32 ^ 11.

我的问题已经被问到herehere,但答案都是错误的,因为:

  1. 他们说碰撞的机会是一些X值,而实际上它取决于目录中已有多少文件。因此,例如,如果您的目录中包含使用Path.GetRandomFileName生成的100,000个文件,则碰撞的可能性高于具有1000个文件的目录。

  2. 他们没有考虑Birthday Problem

  3. 如果可能的话,我很感激你能否以一种易于使用的方式呈现这个公式,这个方式对于没有大学水平数学知识的人来说很容易使用,或者如果你可以给出如何计算它的指示特定值(例如,如果目录有1000个文件)。

1 个答案:

答案 0 :(得分:1)

在数学堆栈交换的人的帮助下回答我自己的问题:

要计算碰撞的概率,请使用生日问题论坛,但使用32 ^ 11而不是365.概率为:

  

1 - exp((-n ^ 2)/(2 * 32 ^ 11))

其中 n 是已使用Path.GetRandomFilename生成的文件数。

您可以使用WolframAlpha等网站轻松计算概率。

例如,如果n=1000,请将以下文本粘贴到WolframAlpha搜索框中:

1-exp((-1000^2)/(2*32^11))

哪个会给你1.38 * 10 ^( - 11)。