Как мне создать свой GUID?

Я собираюсь загружать изображения в систему и нуждаться в их ссылках с помощью уникального уникального идентификатора. Я немного читал о GUID, и мне интересно, какой лучший подход к его созданию в PHP. Должен ли я md5() текущая временная метка и ее соль, или достаточно ли PHP uniqueid (http://www.php.net/manual/en/function.uniqid.php)?

Спасибо!

Ответы

Ответ 1

EDIT:

Хлоп! Я забыл об этом древнем ответе. Чтобы прояснить путаницу, созданную по моей наивности (в соответствии с комментариями, сделанными ниже): MD5 (как и большинство полезных хэшей по своей природе) не являются инъективными, поэтому их выход не гарантированно уникален для всех входов.

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


Так как uniqid использует текущее время в микросекундах для генерации guid, практически нет шансов, что вы когда-нибудь столкнетесь с тем же один раз.

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

Ответ 2

GUID - это версия UUID Microsoft. PHP uniqid - это версия 4 UUID. Определенно достаточно хорошо.

Ответ 3

Я также хочу создать guid для вызова .net api, и эта функция генерирует ключ в формате guid и работает для меня

function generateGuid($include_braces = false) {
    if (function_exists('com_create_guid')) {
        if ($include_braces === true) {
            return com_create_guid();
        } else {
            return substr(com_create_guid(), 1, 36);
        }
    } else {
        mt_srand((double) microtime() * 10000);
        $charid = strtoupper(md5(uniqid(rand(), true)));

        $guid = substr($charid,  0, 8) . '-' .
                substr($charid,  8, 4) . '-' .
                substr($charid, 12, 4) . '-' .
                substr($charid, 16, 4) . '-' .
                substr($charid, 20, 12);

        if ($include_braces) {
            $guid = '{' . $guid . '}';
        }

        return $guid;
    }
}