生成短而独特的文件/文件夹名称的好方法是什么?

时间:2009-04-30 22:21:01

标签: php string unique

标准基本上是这样的:

  • 文件夹将存在约24-48小时
  • 用户无法轻易猜出
  • 文件夹名称(如果在网址中使用)
  • 文件夹名称应为5-15个字符

初步想法:

printf('%u',crc32(microtime(true)));

详细说明: 上传文件时,我基本上想保留上传者指定的唯一文件名,所以为了避免任何命名冲突,我想把它放在一个唯一命名的目录中......

8 个答案:

答案 0 :(得分:6)

[编辑]等一下。 PHP包含在标准库中unique id generator function。还有other approaches

答案 1 :(得分:1)

经典技术看起来像

  + uploader-name  
    + 20090401
      + 010000     // hhmmss
      + 013000     // hhmmss
      + 014500     // hhmmss
    ...

    + 20090402

根据所需的粒度添加级别,附加“a”,“b”,“c”,...等。

这适用于esp。好吧,如果用户按时间顺序与文件相关。

你最终会做一些存在的枚举,但这并不是那么痛苦。我已经多次使用过(包括使用PHP),主要是因为用户阻力低于我发现的任何替代品。

如果您如此倾向,可以美化日期表达 - “2009年4月1日”,“01:45 AM”等。

答案 2 :(得分:0)

没有指定语言,在Ruby中我会这样做:

require 'digest/md5'
Digest::MD5.hexdigest(Time.now.to_s)

=> "f531384b3cc8c60b7c5b7ad087cb0ae4"

答案 3 :(得分:0)

这听起来像是一个“默默无闻”的问题。我会建议反对任何创建潜在敏感数据的东西,并以一种安全的方式暴露它(即使是很短的时间)只是因为期望没有人会猜到这个位置。存在暴力攻击,它们可以破坏这种“安全”。

答案 4 :(得分:0)

使用日期和时间生成名称

答案 5 :(得分:0)

我会使用类似的东西:

$salt='Whatever you want';
$folderName=SHA1($salt.date('U'));

日期('U')返回自Unix Epoch(1970年1月1日00:00:00 GMT)以来的秒数,因此除非您同时生成多个文件夹,否则它可能会是唯一的?

在这种情况下,只需巧妙地更改$ salt值(使其成为用户名或随机数等)。

答案 6 :(得分:0)

如果用户大致知道生成目录的时间,那么基于时间的哈希(md5或sha)就可以猜测。他们所需要做的就是设置一个简单的脚本来生成所有可能的方法,只需几秒钟,然后点击站点寻找响应。添加盐虽然有用,但从长远来看并没有太大作用。

对于OP,上述情况适用于任何方法。如果您运行的是非常快的服务器,则需要监视针对随机目录的命中。只有5个字母的目录意味着有人可以手动命中网站足够的时间来发现目录。 15确实有所增加,但是有一些机器以脚本方式进行,它并非可能性。

答案 7 :(得分:0)

C ++标准在cstdio(stdio.h)中都有函数tmpfile和tmpnum,并相应地创建临时文件和临时文件名。但是在程序结束时删除了tmpfile。我会链接他们,但遗憾的是我还不能发布链接。