php - 如何根据创建时间为目录中的文件名分配唯一 ID
问题描述
我有以下功能来获取给定目录中的所有图像和视频。可以看出,我正在使用循环计数为每个文件分配一个唯一的 id。
问题是,计数器会根据文件名而改变。
例如,zyxw.png
可能是$data[1]['name']
今天,但如果明天有一个新文件abcd.png
添加到目录中,那么它将成为$data[1]['name']
并且zyxw.png
将成为$data[2]['name']
,因为该目录是按文件名列出的。
我需要一种方法来分配一个永远不会改变的唯一 ID。我能想到的唯一方法是根据文件创建日期和时间分配 id。我意识到如果 2 个文件具有完全相同的文件创建日期/时间,这可能会导致冲突,但我想不出其他方法来做到这一点。
所以问题是:
1:有没有更好的选择来分配一个唯一的ID?
2:我将如何以这种方式做到这一点,每个 id 都是唯一的,并且随着更多文件添加到目录中,id 顺序不会改变?
function getDirEnties($directory, &$results, $friend, $static_path) {
$i = 0;
$entries = scandir($directory);
foreach ($entries as $item) {
if (!in_array($item, ['.', '..']) && substr($item, 0, 1) !== '.') {
$path = $directory . '/' . $item;
$rel_path = $static_path . '/' . $item;
if (is_dir($path)) {
getDirEnties($path, $results, $friend, $rel_path);
} else {
$i++;
$pathInfo = pathinfo($path);
$name = $pathInfo['filename'];
$type = 'unknown';
if (!empty($pathInfo['extension'])) {
$name .= "." . $pathInfo['extension'];
switch (strtolower($pathInfo['extension'])) {
case "gif":
case "jpg":
case "png":
case "jpeg":
case "bmp":
//etc..
$type = 'image';
break;
case "mp4":
$type = 'video';
break;
}
}
$tttt = filemtime($path);
$data = [
'name' => $name,
'username' => $friend,
'time' => date('m/d/Y h:i:s a', $tttt),
'path' => $rel_path,
'type' => $type,
'id' => $i,
];
$results[] = $data;
}
}
}
if (isset($data)) {
return $data;
}
}
解决方案
如果您正在寻找唯一文件的唯一 ID(因此,如果稍后处理相同的文件,它将获得相同的 ID),然后使用非常快速的哈希算法和较小的密钥大小对文件名 + 文件大小进行哈希处理,并将其用作你的 ID 值。
如果您希望处理的每个文件都有一个唯一 ID,请使用包含毫秒的时间戳。
推荐阅读
- c++ - Xcode 10.2 中的新 C++ 项目未构建
- c++ - 这个嵌套结构声明是什么意思?
- android - 影子 PackageParser.call ParsePackage PackageParser$Packageparserexception
- markers - 如何获得 SSML来自 Google Cloud 文本转语音 API 的时间戳
- python - 在 Celery python 中使用多个后端
- mysql - MySQL 转储还原不会为仅包含 1 行的表还原数据
- ruby-on-rails - 在 Rspec 和 FactoryBot 期间出错未定义的常量和冻结的数组
- python - 如何遍历python中的列表列表
- python - 如何找到位置最低的白色像素?
- c# - 创建方法尝试从表单插入 FK 作为 ID