【问题标题】:Chances for a collision when using Path.GetRandomFileName使用 Path.GetRandomFileName 时发生冲突的可能性
【发布时间】:2017-06-29 20:24:12
【问题描述】:

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

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

  1. 他们说发生冲突的可能性是某个 X 值,而实际上它取决于目录中已有多少文件。因此,例如,如果您有一个包含 100,000 个使用 Path.GetRandomFileName 生成的文件的目录,那么与包含 1000 个文件的目录相比,发生冲突的机会更高。

  2. 他们不考虑Birthday Problem

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

【问题讨论】:

  • “Chances for”是“Probability of”的同义词,而“collision”与“already existing”的含义完全相同,所以这个问题与stackoverflow.com/questions/27945559/…完全相同
  • 目录中现有文件的问题无关紧要。现有 1000 个文件时发生冲突的概率与从空目录开始并调用函数 1000 次以创建 1000 个文件时发生冲突的概率完全相同。
  • @MikeNakis:1)我已经在我的问题中写道,这个问题已经被问过了。就读吧。 2)你错了。空目录的冲突概率与目录已有 1000 个文件时的冲突概率不同。
  • 发生冲突的概率为 = (driectory 中的文件数)/32^11。

标签: c# random statistics probability


【解决方案1】:

在数学 stackexchange 的一个人的帮助下回答我自己的问题:

要计算碰撞的概率,请使用生日问题公式,但使用 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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多