有人可以在 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 */