标准基本上是这样的:
- 文件夹将存在约 24-48 小时
- 文件夹名称不容易被用户猜到(如果在 URL 中使用)
- 文件夹名称应短 5-15 个字符
初步想法:
printf('%u',crc32(microtime(true)));
细节:上传文件时,我基本上想保持上传者命名的唯一文件名,所以为了避免任何命名冲突,我想把它放在一个唯一命名的目录中......
[编辑] 等一下。PHP 在标准库中包含一个唯一的 id 生成器函数。还有其他方法。
经典技术看起来像
+ uploader-name
+ 20090401
+ 010000 // hhmmss
+ 013000 // hhmmss
+ 014500 // hhmmss
...
+ 20090402
根据所需的粒度添加级别、附加“a”、“b”、“c”等。
这特别有效。好吧,如果用户完全按时间顺序与文件相关。
您最终会进行一些存在枚举,但这并不那么痛苦。我已经使用了很多次(包括使用 PHP),主要是因为用户阻力低于我发现的任何替代方案。
如果您愿意,可以美化日期表达式 - “2009-Apr-01”、“01:45AM”等。
没有指定语言,在 Ruby 中我会这样做:
require 'digest/md5'
Digest::MD5.hexdigest(Time.now.to_s)
=> "f531384b3cc8c60b7c5b7ad087cb0ae4"
这听起来像是一个“默默无闻的安全”问题。我建议反对任何创建潜在敏感数据并以安全的方式公开它(即使是很短的时间)的事情,因为期望没有人会猜到位置。存在蛮力攻击,它们可以破坏这种类型的“安全性”。
使用日期和时间来生成名称
我会使用类似的东西:
$salt='Whatever you want';
$folderName=SHA1($salt.date('U'));
Date('U') 返回自 Unix 纪元(格林威治标准时间 1970 年 1 月 1 日 00:00:00)以来的秒数,因此除非您同时生成多个文件夹,否则它可能是唯一的?
在这种情况下,只需巧妙地更改 $salt 值(使其成为用户名或随机数等)。
如果用户大致知道何时生成目录,则基于时间的哈希(md5 或 sha)可以猜测。他们需要做的就是设置一个简单的脚本来生成涵盖几秒钟的所有可能性,然后点击站点寻找响应。添加盐虽然会有所帮助,但从长远来看并没有多大好处。
对于 OP,以上内容适用于任何方法。如果您正在运行一个非常快的服务器,您将需要监控随机目录的命中。只有 5 个字母的目录意味着有人可以手动访问该站点足够多次来发现该目录。15 确实增加了它,但有一些机器以脚本方式执行它,这并非不可能。
C++ 标准在 cstdio (stdio.h) 中具有函数 tmpfile 和 tmpnum,并相应地创建临时文件和临时文件名。tmpfile 在程序结束时被删除。我会链接它们,但遗憾的是我还不能发布链接。