我可以对文件名使用 MD5 或 SHA1 哈希吗?

Can I use MD5 or SHA1 hashes for filenames?

让我们考虑一个用户可以上传文件的网站。我可以使用其内容的 MD5 或 SHA1 哈希值作为文件名吗?如果没有,我应该使用什么?为了避免碰撞。

您几乎可以使用任何东西作为文件名,但不包括保留字符。除了哈希值之外,这些特定的选择不会告诉您有关文件本身的任何信息。如果他们没有上传相同的文件,那应该可以防止文件命名冲突。如果你不在乎这个,那就去吧。

通常人们上传文件是为了让别人把它们拉回来down。所以你需要有某种描述符;否则用户将需要打开大量文件才能获得他们想要的文件。或许更好的选择是让用户 select 一个名称(不超过字符数限制),然后附加日期时间代码。然后,为了发生冲突,您需要在同一时间有 2 个用户 select 完全相同的名称。在日期时间代码中包括秒数,碰撞的可能性接近(但永远不等于)零。

尽管之前有 SHA1 冲突攻击,但 SHA1 哈希冲突概率仍然很低,在大多数情况下可以假定可以安全地用作文件名。

另一种常用方法是对每个文件使用 GUID/UUID。所以剩下的唯一问题就是你想如何处理两个用户上传的两个相同的文件。最简单的方法就是把它们当成两个独立的文件,互不影响。

虽然有时您可能会担心存储 space。比如上传的文件比较大,可以考虑将两个一模一样的文件存为一个,这样可以节省space。根据您系统的用户体验,您可能需要在之后处理某些情况,例如当两个用户之一删除文件时。然而,这些并不难处理,只是取决于您系统的其余部分。