0

有人可以在 php 中建议一个复杂的算法来命名将被上传的文件,以便它永远不会重复吗?我想知道拥有数百万视频的 youtube 是如何做到的?

现在我使用一个随机数并获取其 16 个字符的 sha1 哈希并用该名称命名文件,但我很确定它最终会重复并生成错误,因为文件将无法保存在文件系统中。

就像是:

$name = sha1(substr(sha1(md5($randomnumber)),0,10));

有人曾经告诉我,破解这段代码生成的哈希是不可能的,或者至少需要 100 年才能破解它。

4

5 回答 5

4

你可以这样做:

$uniq = md5(uniqid(rand(), true));

您还可以应用上传文件的用户的用户 ID,例如:

$uniq = $user_id_of_uploader."_".md5(uniqid(rand(), true));
于 2013-01-24T04:55:06.800 回答
1

使用预先存在的实现生成 GUID(有时称为 UUID)。GUID 对于每台计算机、时间戳、在该时间戳期间生成的 GUID 等都是唯一的,因此它们永远不会重复。

如果制作 GUID 不可用,则在整个输入上使用 sha1 并使用它的整个输出是第二好的。

于 2013-01-24T05:03:32.317 回答
1
$name = 'filename'.$user_id(if_available).md5(microtime(true)).'extension';

尝试从文件名中删除特殊字符和空格。

如果您将名称保存在数据库中,那么递归函数可能会有所帮助。

于 2013-01-24T05:06:48.930 回答
0

使用适当的方法执行以下操作。

  • 首先切片其扩展名和文件名
  • 现在修剪文件名
  • 将多个空格变为单个空格
  • 将特殊字符和空格替换为_
  • 前缀与当前时间戳使用 strtotime和盐使用md5(uniqid(rand(), true))分隔_(感谢@Sudhir)
  • 使用特殊签名后缀str_pad并限制文件的文本长度
  • 现在再次添加扩展名和格式化文件名

希望它有意义。

谢谢

于 2013-01-24T05:00:39.347 回答
0

我通常只为文件名生成一个字符串(实现并不是非常重要),然后检查是否已经存在具有该名称的文件。如果是这样,请在其上附加一个计数器。如果您不知何故有很多具有相同基本文件名的文件,这可能效率低下,但假设您的字符串足够独特,它不应该经常发生。还有检查文件是否存在的开销。

$base_name = generate_some_random_string(); // use whatever method you like
$extension = '.jpg'; // Change as necessary
$file_name = $base_name . $extension;
$i = 0;
while (file_exists($file_name)) {
    $file_name = $base_name . $i++ . $extension;
}
/* insert code to save the file as $file_name */
于 2013-01-24T05:20:49.083 回答