Как назначить уникальный идентификатор именам файлов в каталоге на основе времени создания - PullRequest
0 голосов
/ 24 декабря 2018

У меня есть следующая функция, чтобы получить все изображения и видео в данном каталоге.Как можно видеть, я использую счетчик циклов для назначения уникального идентификатора каждому файлу.

Проблема в том, что счетчик будет меняться в зависимости от имени файла.

Например, zyxw.png может быть $data[1]['name'] сегодня, но если завтра новый каталог abcd.png будет добавлен в каталог, тогда он будет $data[1]['name'], а zyxw.png станет $data[2]['name'], потому чтокаталог указан по имени файла.

Мне нужен способ присвоить уникальный идентификатор, который никогда не меняется.Единственный способ сделать это - назначить идентификатор на основе даты и времени создания файла.Я понимаю, что это может привести к коллизиям, если 2 файла имеют одинаковую дату / время создания файла, но я не могу придумать другого способа сделать это.

Итак, вопросы:

1:Есть ли лучший вариант назначить уникальный идентификатор?

2: Как бы я сделал это таким образом, чтобы каждый идентификатор был уникальным, а порядок идентификаторов не менялся по мере добавления файлов в каталог?

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 голосов
/ 24 декабря 2018

Метка времени довольно уникальна с точностью до миллисекунды.Но чтобы действительно избежать коллизий, используйте идентификатор пользователя плюс отметку времени.Потому что ни один пользователь никогда не собирается сохранять два видео с одинаковой отметкой времени в миллисекундах.

0 голосов
/ 24 декабря 2018

Если вы ищете уникальный идентификатор для уникального файла (то есть, если тот же файл обрабатывается позже, он получает тот же идентификатор), то хешируйте имя файла + размер файла с очень быстрым алгоритмом хеширования и небольшим размером ключа ииспользуйте это в качестве значения Id.

Если вы хотите, чтобы уникальный идентификатор для каждого обрабатываемого файла использовался, отметка времени включала бы миллисекунды.

См. этот пост: https://softwareengineering.stackexchange.com/questions/49550/which-hashing-algorithm-is-best-for-uniqueness-and-speed

...