如何根据创建时间为目录中的文件名分配唯一ID

时间:2018-12-24 00:43:44

标签: php file time unique counter

我具有以下功能来获取给定目录中的所有图像和视频。可以看出,我正在使用循环计数为每个文件分配唯一的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;
    }
}

2 个答案:

答案 0 :(得分:1)

如果您正在寻找唯一文件的唯一ID(因此,如果稍后处理同一文件,它将获得相同的ID),则可以使用非常快速的哈希算法和较小的密钥大小对文件名+文件大小进行哈希处理,将其用作您的ID值。

如果您希望每个处理的文件都有唯一的ID,请使用包含毫秒的时间戳。

查看此帖子: https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

答案 1 :(得分:0)

时间戳非常独特,可以精确到毫秒。但是要真正确保不发生冲突,请使用用户ID和时间戳。因为没有一个用户会在完全相同的毫秒时间戳内保存两个视频。