【问题标题】:Is a good idea to use a GUID in name of files generated by users?在用户生成的文件名中使用 GUID 是个好主意吗?
【发布时间】:2011-10-02 18:01:45
【问题描述】:

我正在构建一个应用程序(CMS),用户可以在其中上传图片等文件。

我的问题是如何重命名这些文件以保存。

我认为生成一个 GUID (System.GUID.NewGuid()) 来保存文件是最好的方法。在这种情况下我是对的还是存在更好的方法?

注意:生成的 GUID 示例:7c9e6679-944b-7425-40from-e07fc1f90ae7。在这种情况下,图像文件将是:7c9e6679-944b-7425-40from-e07fc1f90ae7.jpg

更新:

用户不会直接与文件名交互。

【问题讨论】:

    标签: c# .net guid


    【解决方案1】:

    是的。但可能更方便的方案是使用内容的哈希和(比如 MD5 和)。

    这样,

    • 文件名的生成是可重复的(如果出现问题,需要将数据迁移到不同的服务器,内容在不同的设备之间共享等)。
    • 您会自动共享重复上传。当然,那么您需要跟踪文件的所有者(在删除最后一次使用之前不要删除它)

    注意一个典型的 md5sum 示例是 5eb63bbbe01eeed093cb22bb8f5acdc3(对于 ASCII/UTF8 “hello world”)

    编辑以响应 cmets(关于哈希冲突):确实,您可能会遇到非常大的文档集的哈希冲突。在这种情况下,最常见的是使用哈希和 + 文件长度来识别“内容 blob”。所以你会做这样的事情:

     http://cms.mysite.local/docs/123986/5e/b63bbbe/01eeed093cb22bb8f5acdc3.png
    

    对于长度约为 123Kb 的 png

    【讨论】:

    • 同意,但您还需要注意哈希冲突。
    • 这简直是一场雪球——但在这种情况下,您必须处理 MD5 冲突。
    • 哈希冲突的可能性非常小,真的不值得担心。如果您有 100 亿份文档,我们说的是 10^-18 的概率。这在“我们更有可能在内存中有一个阿尔法粒子翻转位”领域。
    • 还有其他hash functions that have a lower colision rate(SHA-1 或Tiger)。此外,添加了一个常见的策略来处理 asnwer 文本中的冲突
    【解决方案2】:

    如果您想要更好的 SEO,您应该在 GUID 之前添加一些内容。更好的是生成您自己的唯一 ID,并结合解释图像/文件的内容(因为 SEO)。

    例如,如果您有一个项目,图像名称可以是:

    itemId-ItemName.jpg

    【讨论】:

    • 以图像名称为前缀的 GUID 也可能有帮助,请查看 MSDN 中的 this 以及使用图像名称时SEO 的效果
    【解决方案3】:

    是的,这种方法很好。它与 Git 存储文件的方式非常相似。如果你按照 Linus Torvalds 的方式做事,那么你可能做对了。

    【讨论】:

    • 它在使用非人类可读的唯一字符串来识别文件的意义上是相似的。 Git 需要能够重现 ID,因此需要使用 SHA 哈希,但大多数人不需要。 ID 的可预测性在这里并不重要。我同意使用哈希可能是一个“更好”的解决方案,但 GUID 便宜、实用并且几乎肯定适合问题的目的。
    • 关键是 OP 询问使用 GUID 是否是一个好主意。是的,这是个好主意。但不要相信我的话!这是一个由一个非常聪明的人设计的广泛使用的系统,它使用类似于 GUID 的东西!请注意,我仅在回复您的评论时提到了 Gits 使用 SHA 的原因,而不是在原始答案中。 提到了,我回应了。
    • @Sehe:在这个问题的上下文中,它们都只是生成唯一名称的方法。一是根据文件内容;一个不是。这是就本问题而言而言的唯一区别。
    【解决方案4】:

    通常我会首先通过 Path.GetTempFileName 将上传的文件保存到临时文件中,然后在通过任何适当的检查后将其移动到具有适当名称的永久存储中。

    见:

    http://msdn.microsoft.com/en-us/library/system.io.path.gettempfilename%28v=vs.80%29.aspx

    对于永久存储,基于 guid 的文件名很好,根据您的数据库服务器,这些名称也可以很好地编入索引,以便快速查询。

    【讨论】:

      【解决方案5】:

      用户是否需要通过文件名直接与文件交互?如果没有,那么使用 GUID 就很好了。

      如果您存储用户提供的名称和生成的名称之间的关联,则用户永远不需要看到 GUID。

      【讨论】:

      • 不,用户不会直接与文件名交互。
      猜你喜欢
      • 2011-05-14
      • 1970-01-01
      • 2013-06-24
      • 1970-01-01
      • 1970-01-01
      • 2019-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多