Hash 哈希片段和冲突cont

Hash 哈希片段和冲突cont,hash,md5,Hash,Md5,对于这个应用程序,我有我的,我觉得我可以用一个40位的散列键,这似乎太低了,但看看你是否能证实我的推理(我想要一个小键,因为我想要一个小文件名,这个键将被转换成一个文件名): (注意:只有意外碰撞是一个问题-没有安全问题。) 这里的一个关键点是,所讨论的种群被分成若干组,只有在同一组中发生碰撞时,碰撞才相关。“组”是用户系统上的一个目录(文件的内容是散列的,只有在同一目录中的文件发生冲突时才相关)。因此,假设大约有100000个潜在用户,比如说2^17,这相当于2^18个“组”,假设每个用户平均

对于这个应用程序,我有我的,我觉得我可以用一个40位的散列键,这似乎太低了,但看看你是否能证实我的推理(我想要一个小键,因为我想要一个小文件名,这个键将被转换成一个文件名):

(注意:只有意外碰撞是一个问题-没有安全问题。)


这里的一个关键点是,所讨论的种群被分成若干组,只有在同一组中发生碰撞时,碰撞才相关。“组”是用户系统上的一个目录(文件的内容是散列的,只有在同一目录中的文件发生冲突时才相关)。因此,假设大约有100000个潜在用户,比如说2^17,这相当于2^18个“组”,假设每个用户平均有2个目录。因此,使用40位键,我可以在某个用户发生冲突之前(在所有用户中)创建2^(20+9)个文件。(或者低2^((40+18)/2),由于“生日效应”。)这是在某个用户发生单一冲突之前,为2^17个用户平均为每个用户创建4096个唯一文件。然后在另一次碰撞发生之前很久(对吧?

你的计算看起来很合理,但我想知道你为什么要费心处理这个问题。如果您想创建唯一的文件名,为什么不为每个用户分配一个编号,并为该用户保留一个序列号呢。当您需要一个文件名时,基本上只需将用户编号与序列号关联(两者都填充到正确的位数)。如果您觉得需要混淆这些数字,请通过40位加密运行该结果(这将确保唯一输入产生唯一输出)

例如,如果为每个文档分配20位,则可以让220个用户在发生冲突之前创建220个文档

如果您不介意对它进行序列化访问,您可以只使用一个40位计数器。这样做的好处是单个用户不会立即使用220个序列号,即使普通用户不太可能创建这么多文档


同样,如果您认为出于某种原因需要混淆此数字,您可以在计数器模式下使用40位加密算法(即使用序列号,但对其进行加密),该算法(再次)确保每个输入映射到唯一的输出。这保证了在用户创建240个文档之前(即仅40位的最大值)不会发生冲突。或者,您可以创建一个40位全量程线性反馈移位寄存器来创建伪随机40位数字。这可能会稍微不太安全,但其优点是实现起来更快、更简单。

主要的问题是,如果(由软件)创建了一个新文件,并且该文件与现有文件相同,则会覆盖现有文件,而不是创建一个具有不同名称的新文件。使用散列创建名称保证相同的文件具有相同的名称。也许应该解释一下。但是如果我关于碰撞概率的数学看起来不错,那就太好了。这对我来说可能有点容易,所以我只是想确认一下。