我正在写一个“文件共享托管”,我想在上传到一个唯一的名称时重命名所有文件,并以某种方式跟踪数据库上的名称。由于我不想要两个或多个具有相同名称的文件(这肯定是不可能的),我正在寻找一种基于密钥或其他东西为我生成随机名称的算法。
此外,我不想生成名称并搜索数据库以查看该文件是否已存在。我想确保我的应用程序之前从未创建过生成的文件名的100%或99%。
知道如何编写此类应用程序吗?
答案 0 :(得分:10)
您可以根据文件内容本身生成哈希。这样做有两个很好的理由:
允许您永远不会存储两次相同的文件 - 例如,如果您有两个内容相同的音乐文件副本,您可以检查是否已存储该文件,并将其存储一次。
您可以从blob中分离元数据(文件名只是元数据)。因此,您将拥有一个由文件内容的哈希索引的存储系统,然后将文件元数据与该哈希查找代码相关联。
根据散列的大小,找到两个计算相同散列但实际上不是相同内容的文件的风险很低,并且您可以通过将文件散列为块来有效地缓解这种情况(可能然后引出一些有趣的存储优化方案:P)。
答案 1 :(得分:3)
GUIDs是单向的。你基本上保证不会得到任何重复(如果你有一个合适的随机发生器)。
答案 2 :(得分:3)
已经提到了最佳解决方案。我只想补充一些想法。
最简单的解决方案是在每个新文件上都有一个计数器和增量。只要只有一个线程创建新文件,这种方法就可以正常工作。如果多个线程,进程甚至系统添加新文件,事情会变得复杂一些。您必须使用锁定或任何类似的同步方法协调创建新ID。您还可以为每个过程分配id范围以减少同步工作,或者通过唯一的进程ID扩展文件ID。
更好的解决方案可能是在此方案中使用GUID,而不必关心进程之间的同步。
最后,你可以在一些随机数据中找到每个标识符,以便更难猜出这是否是一项要求。
同样,coommon将文件存储在目录结构中,其中文件的位置取决于其名称。文件abcdef1234.xyz可能存储为/ab/cd/ef/1234.xyz。这避免了具有大量文件的目录。我真的不知道为什么这样做 - 可能是文件系统限制,性能问题 - 但它很常见。如果文件直接存储在数据库中,我不知道类似的事情是否常见。
答案 3 :(得分:2)
你也可以附上自纪元以来的时间。
答案 4 :(得分:1)
最好的方法是简单地使用计数器。第一个文件是1,下一个是2,另一个是3,依此类推......
但是,似乎你想要随机。要快速执行此操作,您可以确保随机数更大,而不是创建的 last 文件。您可以缓存最后一个文件,然后使用其姓氏偏移您的随机数。
file = last_file + random(1 through 10)