programing

uniqid는 얼마나 고유합니까?

nasanasas 2020. 10. 22. 08:06
반응형

uniqid는 얼마나 고유합니까?


이 질문은 해결책을 찾는 데 실제로 문제가 아니라 단순한 호기심의 문제 일뿐입니다. PHP uniqid 함수는 출력을 "더 고유"하게 만들기 위해 더 많은 엔트로피 플래그를 가지고 있습니다. 이로 인해 more_entropy가 true 일 때와 그렇지 않을 때이 함수가 동일한 결과를 한 번 이상 생성 할 가능성이 얼마나되는지 궁금합니다. 즉, more_entropy가 활성화 된 경우와 비활성화 된 경우에는 uniqid가 얼마나 고유합니까? more_entropy를 항상 사용하는 데 단점이 있습니까?


2014 년 3 월 업데이트 :

첫째, uniqid고유 ID를 보장하지 않기 때문에 약간 잘못된 이름이라는 점에 유의하는 것이 중요합니다 .

PHP 문서 :

경고!

이 함수는 임의의 또는 예측할 수없는 문자열을 생성하지 않습니다. 이 기능은 보안 목적으로 사용해서는 안됩니다. 암호화 보안 무작위 함수 / 생성기 및 암호화 보안 해시 함수를 사용하여 예측할 수없는 보안 ID를 생성합니다.

이 함수는 암호화 된 보안 토큰을 생성하지 않습니다. 사실 추가 매개 변수를 전달하지 않으면 반환 값이 microtime () 과 약간 다릅니다 . 암호화 보안 토큰을 생성해야하는 경우 openssl_random_pseudo_bytes ()를 사용하십시오 .


more-entropy를 true로 설정하면 더 고유 한 값이 생성되지만 문서에 따르면 실행 시간이 약간 더 길어집니다.

TRUE로 설정하면 uniqid ()는 반환 값 끝에 추가 엔트로피 (결합 된 선형 합동 생성기 사용)를 추가하여 결과가 고유 할 가능성을 높입니다.

선이 increases the likelihood that the result will be unique아니라 고유성 보장 합니다.

당신은 '끝없이'점까지, 고유성을 위해 노력하고, 암호화 루틴의 번호를 사용하여 강화, 추가 할 수 있습니다 과 같은 -는 목적에 따라 달라집니다.

특히 다음과 같은 주요 PHP 주제에 대한 주석을 살펴 보는 것이 좋습니다.

http://www.php.net/manual/en/function.uniqid.php#96898

http://www.php.net/manual/en/function.uniqid.php#96549

http://www.php.net/manual/en/function.uniqid.php#95001

내가 권장하는 것은 고유성이 필요한지, 보안을위한 것입니까 (예 : 암호화 / 스크램블링 루틴에 추가)? 또한 얼마나 고유해야합니까? 마지막으로 속도 고려 사항을 살펴보십시오. 적합성은 기본 고려 사항에 따라 변경됩니다.


이미 존재하지 않는지 확인하는 경우에만 고유합니다. '무작위'문자열 또는 ID를 생성하는 데 사용하는 함수는 중요하지 않습니다. 중복이 아닌지 다시 확인하지 않으면 항상 그 기회가 있습니다 ..;)

uniqid는 현재 시간을 기반으로하지만 위의주의 사항은 여전히 ​​적용됩니다. 이는 이러한 "고유 ID"를 사용할 위치에 따라 다릅니다. 이 모든 것에 대한 단서는 "더 독특하다"는 것입니다. 독특하다 독특하다 독특하다. 다소 독특한 것을 가질 수있는 방법은 나에게 약간 혼란 스럽습니다!

위와 같이 확인하고이 모든 것을 결합하면 고유성에 접근 할 수 있지만 키가 사용되는 위치와 컨텍스트와 관련이 있습니다. 도움이 되었기를 바랍니다.


PHP 매뉴얼 사이트의 함수에 대한 토론에서 :

아래의 다른 사람들이 언급 하듯이 접두사없이 "추가 된 엔트로피"없이이 함수는 단순히 마이크로 초 카운터가 추가 된 UNIX 타임 스탬프를 16 진수로 반환합니다. hexit 형태의 microtime ()에 불과합니다.

[...]

또한 microtime ()은 Windows에서 기본적으로 지원하지 않는 gettimeofday ()> 존재하는 시스템에서만 작동하므로 uniqid ()는 Windows 환경에서 1 초 단위의 UNIX 타임 스탬프 만 생성 할 수 있습니다.

즉, "more_entropy"가 없으면이 함수는 절대적으로 끔찍하며 절대 사용해서는 안됩니다. 문서에 따라 플래그는 "엔트로피 추가"를 위해 "결합 된 선형 합동 생성기"를 사용합니다. 음, 그것은 꽤 약한 RNG입니다. 그래서 저는이 기능을 완전히 건너 뛰고 보안과 관련이없는 것에 대해서는 좋은 시드를 가진 mt_rand기반으로 하고있는 것에 대해서는 SHA-256을 사용합니다.


more_unique 플래그가 없으면 마이크로 초 카운터가있는 유닉스 타임 스탬프를 반환하므로 동일한 마이크로 초에 두 번의 호출이 이루어지면 동일한 '고유'ID를 반환합니다.

거기에서 그것이 얼마나 가능성이 있는지에 대한 질문이 있습니다. 대답은 그다지 많지는 않지만 할인 가능한 정도는 아닙니다. 이 경우 필요한 고유 ID를 당신이 자주 발생 (또는 다른 곳에서 생성 된 데이터와 작업)가 절대적으로 고유하게에 포함되지 않습니다.


소스 코드 의 관련 비트

if (more_entropy) {
    uniqid = strpprintf(0, "%s%08x%05x%.8F", prefix, sec, usec, php_combined_lcg() * 10);
} else {
    uniqid = strpprintf(0, "%s%08x%05x", prefix, sec, usec);
}

따라서 more_entropy다소 임의의 10 진수 9 개를 추가합니다 ( php_combined_lcg()에서 값을 반환합니다 (0,1)). 즉, 29.9 비트의 엔트로피, 최상위입니다 (실제로는 LCG가 암호 학적으로 안전한 의사 난수 생성기가 아니기 때문에 더 적을 수 있습니다).

참고 URL : https://stackoverflow.com/questions/4070110/how-unique-is-uniqid

반응형