命名文件的算法,没有重复的可能性


algorithm to name files with no probability of repetition

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

的??

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

像这样:

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

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

你可以做:

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

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

$uniq = $user_id_of_uploader."_".md5(uniqid(rand(), true));

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

如果制作 GUID 不可用,则对整个输入使用 sha1 并使用它的整个输出是次佳的。

$name = 'filename'.$user_id(if_available).md5(microtime(true)).'extension';

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

如果要在数据库中保存名称,则递归函数可能会有所帮助。

使用正确的方法执行以下操作。

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

希望它有意义。

谢谢

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

$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 */