> 백엔드 개발 > PHP 튜토리얼 > PHP로 UUID를 생성하는 올바른 방법은 무엇입니까?

PHP로 UUID를 생성하는 올바른 방법은 무엇입니까?

WBOY
풀어 주다: 2023-03-01 21:36:01
원래의
2121명이 탐색했습니다.

온라인에서 검색해 보니 대체로 다음과 유사한 것으로 나타났습니다.

<code>        $chars = md5(uniqid(mt_rand(), true));
        $uuid  = substr($chars,0,8) . '-';
        $uuid .= substr($chars,8,4) . '-';
        $uuid .= substr($chars,12,4) . '-';
        $uuid .= substr($chars,16,4) . '-';
        $uuid .= substr($chars,20,12);
        return $prefix . $uuid;</code>
로그인 후 복사
로그인 후 복사
<code>            mt_srand ( ( double ) microtime () * 10000 ); //optional for php 4.2.0 and up.随便数播种,4.2.0以后不需要了。
            $charid = strtoupper ( md5 ( uniqid ( rand (), true ) ) ); //根据当前时间(微秒计)生成唯一id.
            $hyphen = chr ( 45 );
            $uuid = '' . 
                substr ( $charid, 0, 8 ) . $hyphen . substr ( $charid, 8, 4 ) . $hyphen . substr ( $charid, 12, 4 ) . $hyphen . substr ( $charid, 16, 4 ) . $hyphen . substr ( $charid, 20, 12 );
            return $uuid;</code>
로그인 후 복사
로그인 후 복사

UUID에 대한 설명을 읽은 후 이러한 생성 방식의 영향률이 기준을 충족하지 못한다고 생각하는 이유는 무엇입니까?

답글 내용:

온라인에서 검색해 보니 대체로 다음과 유사한 것으로 나타났습니다.

<code>        $chars = md5(uniqid(mt_rand(), true));
        $uuid  = substr($chars,0,8) . '-';
        $uuid .= substr($chars,8,4) . '-';
        $uuid .= substr($chars,12,4) . '-';
        $uuid .= substr($chars,16,4) . '-';
        $uuid .= substr($chars,20,12);
        return $prefix . $uuid;</code>
로그인 후 복사
로그인 후 복사
<code>            mt_srand ( ( double ) microtime () * 10000 ); //optional for php 4.2.0 and up.随便数播种,4.2.0以后不需要了。
            $charid = strtoupper ( md5 ( uniqid ( rand (), true ) ) ); //根据当前时间(微秒计)生成唯一id.
            $hyphen = chr ( 45 );
            $uuid = '' . 
                substr ( $charid, 0, 8 ) . $hyphen . substr ( $charid, 8, 4 ) . $hyphen . substr ( $charid, 12, 4 ) . $hyphen . substr ( $charid, 16, 4 ) . $hyphen . substr ( $charid, 20, 12 );
            return $uuid;</code>
로그인 후 복사
로그인 후 복사

UUID에 대한 설명을 읽은 후 이러한 생성 방식의 영향률이 기준을 충족하지 못한다고 생각하는 이유는 무엇입니까?

UUID를 생성하기 위한 소위 PHP 방법 중 다수는 현재 알고리즘의 기초로 난수를 사용합니다. 이는 실제로 반복될 가능성은 없지만 이론상으로는 불가능합니다.

여기서는 MongoDb의 ObjectId를 예로 들어보겠습니다. 저는 개인적으로 이 생성 방법을 PHP에 도입할 수 있다고 생각합니다.
ObjectId는 크게 타임스탬프, 밀리초, 기계어 코드, 자동 증가 횟수의 네 부분으로 나뉩니다.

처음 두 가지에 대해서는 자세히 설명할 필요가 없습니다. PHP는 후자 두 가지에 중점을 둡니다.

기계 코드는 주로 서로 다른 호스트 간에 동일한 UUID가 생성되는 것을 방지하기 위해 사용됩니다.
현재 기계어 코드를 생성하는 주요 방법은 하드웨어 정보를 기반으로 한 해시 계산이며 이 방법은 PHP에는 적합하지 않습니다.
주로 두 가지 이유 때문에 하나는 PHP가 하드웨어 정보를 직접 얻을 수 없다는 점(확장 또는 로컬 명령 실행 등이 필요함)과 다른 하나는 PHP가 요청 간에 데이터를 공유할 수 없다는 점입니다. 성능에 큰 영향을 미치는 기계어 코드를 가져옵니다.
이 문제를 해결하는 아주 간단한 방법이 있는데, 먼저 여러 컴퓨터의 기계어 코드를 계산한 다음 이를 구성 파일에 직접 쓴 다음 PHP 처리 중에 직접 읽는 것입니다.

자동 증가 횟수는 동시 처리에서 동일한 UUID가 생성되는 것을 방지하기 위해 주로 사용됩니다.
자동 증가의 경우 PHP는 요청 간에 데이터를 공유할 수 없기 때문에 자동 증가 계산을 직접 구현할 수 없습니다.
이 문제를 해결하기 위해 세마포어와 공유 메모리라는 두 가지 PHP 확장을 도입할 수 있습니다. 두 확장 모두 PHP 소스 코드에 통합되어 있으며 --enable-sysvsem 및 --enable-sysvshm을 통해 열 수 있습니다. 자동 증가 기술을 공유하려는 동시 요청의 목적을 달성하려면 자동 증가 번호를 공유 메모리에 배치한 다음 세마포어를 통한 액세스를 제한하면 됩니다. 물론, 자체 증가는 다른 도구를 통해서도 달성할 수 있습니다.

Linux 커널은 UUID 생성 인터페이스를 제공합니다.
cat /proc/sys/kernel/random/uuid
Linux의 모든 것은 파일입니다. 어떤 프로그램이든 파일을 읽어 UUID를 얻을 수 있습니다.

스스로 독특한 가치를 창출해보세요:

<code>php best.php
<?php
echo uniqid(mt_rand().'_', true)."\n";
echo uniqid(mt_rand().'_', true)."\n";
//代码前后两次调用输出都不一样:
405797689_58295933a5de69.42485678
748054035_58295933a5e072.26553654
//如果运行时再加上远程用户地址/端口/进程PID的话,唯一性应该都已经够用了.
echo uniqid($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['REMOTE_PORT'].'_'.getmypid().'_'.mt_rand().'_', true)."\n";
echo uniqid($_SERVER['REMOTE_ADDR'].'_'.$_SERVER['REMOTE_PORT'].'_'.getmypid().'_'.mt_rand().'_', true)."\n";</code>
로그인 후 복사

게다가 openssl_random_pseudo_bytes을 사용하면 좋은 임의 문자열을 생성할 수도 있는 것 같습니다.

<code>echo base64_encode(openssl_random_pseudo_bytes(32));</code>
로그인 후 복사
관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿