2

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

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

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

4

5 回答 5

11

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

  1. 允许您永远不会存储相同的文件两次 - 例如,如果您有两个内容相同的音乐文件副本,您可以检查您是否已经存储了该文件,然后只存储一次。

  2. 您将元数据(文件名只是元数据)与 blob 分开。因此,您将拥有一个由文件内容的哈希索引的存储系统,然后您将文件元数据与该哈希查找代码相关联。

根据散列的大小,找到计算相同散列但内容不同的两个文件的风险很低,您可以通过将文件分块散列来有效缓解这种情况(这可能会导致一些有趣的存储优化方案:P)。

于 2009-03-31T02:56:06.487 回答
4

GUID是一种方式。基本上可以保证您不会得到任何重复(如果您有适当的随机生成器)。

于 2009-03-31T02:37:32.723 回答
3

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

于 2009-03-31T02:40:21.250 回答
3

最好的解决方案已经提到过。我只是想补充一些想法。

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

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

最后,您可以为每个标识符添加一些随机数据,以使它们更难猜测是否这是必需的。

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

于 2009-03-31T02:57:24.767 回答
1

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

但是,似乎你想要随机。要快速做到这一点,您可以确保您的随机数大于最后创建的文件。您可以缓存最后一个文件,然后用其姓氏偏移您的随机数。

file = last_file + random(1 through 10)
于 2009-03-31T02:38:44.217 回答