온라인에서 검색해 보니 대체로 다음과 유사한 것으로 나타났습니다.
<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>