Algorithm 自动生成文件名,无冲突

Algorithm 自动生成文件名,无冲突,algorithm,language-agnostic,unique,Algorithm,Language Agnostic,Unique,我正在写一个“文件共享主机”,我想在上传到一个唯一的名称时重命名所有文件,并以某种方式跟踪数据库中的名称。因为我不希望两个或多个文件具有相同的名称(这当然是不可能的),所以我正在寻找一种基于密钥或其他东西的算法,为我生成随机名称 此外,我不想生成名称并搜索数据库以查看文件是否已经存在。我想确保100%或99%的生成的文件名以前从未被我的应用程序创建过 你知道我如何编写这样的应用程序吗?是一种方法。基本上保证不会重复(如果您有合适的随机生成器)。最好的方法是使用计数器。第一个文件是1,下一个是2,

我正在写一个“文件共享主机”,我想在上传到一个唯一的名称时重命名所有文件,并以某种方式跟踪数据库中的名称。因为我不希望两个或多个文件具有相同的名称(这当然是不可能的),所以我正在寻找一种基于密钥或其他东西的算法,为我生成随机名称

此外,我不想生成名称并搜索数据库以查看文件是否已经存在。我想确保100%或99%的生成的文件名以前从未被我的应用程序创建过


你知道我如何编写这样的应用程序吗?

是一种方法。基本上保证不会重复(如果您有合适的随机生成器)。

最好的方法是使用计数器。第一个文件是1,下一个是2,另一个是3,依此类推

但是,你似乎想要随机的。要快速执行此操作,可以确保随机数大于上次创建的文件。您可以缓存最后一个文件,然后用其姓氏偏移随机数

file = last_file + random(1 through 10)

您还可以附加自纪元以来的时间。

您可以根据文件内容本身生成哈希。这样做有两个很好的理由:

  • 允许您从不存储同一文件两次-例如,如果您有两份内容相同的音乐文件副本,您可以检查是否已存储该文件,然后只存储一次

  • 您可以将元数据(文件名只是元数据)从blob中分离出来。因此,您将拥有一个存储系统,该系统由文件内容的哈希索引,然后将文件元数据与该哈希查找代码关联


  • 根据散列的大小,发现两个计算相同散列的文件实际上不是相同内容的风险很低,您可以通过将文件分块散列(这可能会导致一些有趣的存储优化场景:p)来有效地降低这种风险.

    已经提到了最佳解决方案。我只想补充一些想法

    最简单的解决方案是在每个新文件上都有一个计数器和增量。只要只有一个线程创建新文件,这就可以很好地工作。如果多个线程、进程甚至系统添加新文件,事情会变得更复杂。您必须使用锁定或任何类似的同步方法来协调新ID的创建。您还可以为每个进程分配id范围,以减少同步工作,或通过唯一的进程id扩展文件id

    更好的解决方案可能是在这种情况下使用guid,而不必关心进程之间的同步

    最后,您可以将一些随机数据添加到每个标识符中,以使它们更难猜测这是否是一项要求


    此外,coommon将文件存储在目录结构中,其中文件的位置取决于其名称。文件abcdef1234.xyz可能存储为/ab/cd/ef/1234.xyz。这样可以避免目录中包含大量文件。我真的不知道为什么会这样做——可能是文件系统限制、性能问题——但这很常见。如果文件直接存储在数据库中,我不知道类似的情况是否常见。

    +1,但我认为您需要“随机(1到10)”--如果您得到0,您将分配与上次相同的ID。如果要执行类似操作,请务必阅读以下文章:源代码管理系统是否有理由不检测此Manger中的链接?有些是这样的。Git将其内部存储库中的所有文件命名为散列文件。