Как мне создать свой GUID? - PullRequest
13 голосов
/ 20 сентября 2009

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

Спасибо!

Ответы [ 3 ]

20 голосов
/ 20 сентября 2009

EDIT:

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

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


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

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

6 голосов
/ 20 сентября 2009

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

2 голосов
/ 31 июля 2014

Я также хочу создать 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;
    }
}
...