Php 无重复概率命名文件的算法

Php 无重复概率命名文件的算法,php,Php,有人能推荐一个复杂的php算法来命名要上传的文件,这样它就不会重复了吗?我想知道拥有数百万视频的youtube是怎么做到的 现在我使用一个随机数,得到它的16个字符的sha1散列,并用这个名称命名文件,但我很确定它最终会重复并生成一个错误,因为文件将无法保存在文件系统中 比如: $name = sha1(substr(sha1(md5($randomnumber)),0,10)); 有人曾经告诉我,不可能破坏由该代码生成的哈希,或者至少需要100年才能破坏它。您可以: $uniq = md5(

有人能推荐一个复杂的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));
你可以做:

$uniq = md5(uniqid(rand(), true));
您还可以添加上载文件的用户的用户id,如:

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

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

  • 首先对其扩展名和文件名进行切片
  • 现在修剪文件名
  • 将多个空间更改为单个空间
  • 将特殊字符和空格替换为to
  • 前缀为当前时间戳using和salt using
    md5(uniqid(rand(),true))
    ,由
    分隔(感谢@Sudhir)
  • 带有特殊签名的后缀,使用并限制文件的文本长度
  • 现在再次添加扩展名和格式化文件名
希望它有意义


谢谢

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

  • 首先对其扩展名和文件名进行切片
  • 现在修剪文件名
  • 将多个空间更改为单个空间
  • 将特殊字符和空格替换为to
  • 前缀为当前时间戳using和salt using
    md5(uniqid(rand(),true))
    ,由
    分隔(感谢@Sudhir)
  • 带有特殊签名的后缀,使用并限制文件的文本长度
  • 现在再次添加扩展名和格式化文件名
希望它有意义

谢谢

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

如果无法生成GUID,则在整个输入上使用sha1并使用其整个输出是次优。

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

$name = 'filename'.$user_id(if_available).md5(microtime(true)).'extension';
如果无法生成GUID,则在整个输入上使用sha1并使用其整个输出是次佳选择

$name = 'filename'.$user_id(if_available).md5(microtime(true)).'extension';
尝试从文件名中删除特殊字符和空格

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

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


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

我通常只为文件名生成一个字符串(实现并不十分重要),然后检查是否已经存在具有该名称的文件。如果是,请在其上附加一个计数器。如果您有很多文件都具有相同的基本文件名,这可能是低效的,但是假设您的字符串足够唯一,那么这种情况不应该经常发生。还有检查文件是否存在的开销

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

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

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


使用GUID………..@diEcho你的意思是我使用时间戳生成一个哈希值吗?如果两个用户同时上传一个文件呢?我知道这不太可能,但有可能。@MitchWheat我没有完全跟着你。请详细说明。@NikhilVerma两次上传之间可能有毫秒的差异。时间戳在任何情况下都是唯一的。(除非非常罕见)使用GUID………..@diEcho你的意思是我使用时间戳生成此代码的哈希吗?如果两个用户同时上传一个文件呢?我知道这不太可能,但有可能。@MitchWheat我没有完全跟着你。请详细说明。@NikhilVerma两次上传之间可能有毫秒的差异。时间戳在任何情况下都是唯一的。(除非非常罕见)你确定这不会冲突或重复吗?你知道像youtube或facebook这样的大公司在生成文件名时可能会使用什么吗?@NikhilVerma好吧,uniqid在大多数情况下不应该冲突,但是如果你想对此进行更多确认,那么你可以添加额外的值,比如在答案中添加的值(上传文件的用户id)谢谢,伙计,附加用户的唯一id似乎是个好主意。@Sudhir我在回答中也使用了您的代码。谢谢你的主意。你确定这永远不会冲突或重复吗?你知道像youtube或facebook这样的大公司在生成文件名时可能会使用什么吗?@NikhilVerma好吧,uniqid在大多数情况下不应该冲突,但是如果你想对此进行更多确认,那么你可以添加额外的值,比如在答案中添加的值(上传文件的用户id)谢谢,伙计,附加用户的唯一id似乎是个好主意。@Sudhir我在回答中也使用了您的代码。谢谢你的主意。是的,这是有道理的。唯一的问题是,如何使用str_pad添加特殊签名?我知道这超出了这个问题的范围,但是如果你能提出一些建议的话?你认为你解释的算法重复的概率为零吗?@NikhilVerma是的,重复的概率为零。请阅读
str_pad
的手册(我也给出了链接)。如果你能做的更好