source

uniqid는 얼마나 고유합니까?

manysource 2022. 12. 13. 20:09

uniqid는 얼마나 고유합니까?

이 질문은 해결책을 찾는 문제가 아니라 단순한 호기심 문제일 뿐입니다.PHP uniqid 함수는 출력을 "좀 더 고유"하게 만들기 위해 더 많은 엔트로피 플래그를 가집니다.이 때문에 이 함수가 more_entropy가 참일 때와 그렇지 않을 때 같은 결과를 두 번 이상 생성할 가능성이 얼마나 되는지 궁금해졌다.즉, more_entropy가 네이블로 되어 있는 경우와 디세이블로 되어 있는 경우의 유니키드는 어느 정도 고유합니까?항상 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"를 사용하는 위치에 따라 달라집니다.이 모든 것의 실마리는 "더 독특하다"는 것이다.Unique는 Unique입니다.어떻게 조금 특이한 걸 가질 수 있는지 좀 헷갈리네요!

위와 같이 체크하고 이 모든 것을 조합하면 키가 사용되는 장소와 컨텍스트에 따라 달라지지만, 이 모든 것이 고유성에 가까워집니다.도움이 됐으면 좋겠네요!

PHP 매뉴얼 사이트의 함수에 대한 설명에서:

아래에 기재한 바와 같이 프리픽스 없이 "added entopy" 없이 이 함수는 단순히 16진수로서 마이크로초 카운터가 추가된 UNIX 타임스탬프를 반환합니다.이것은 거의 헥시트 형식으로 마이크로타임()입니다.

[...]

또한 microtime()은 gettimeofday() > present가 있는 시스템에서만 동작하지만 Windows 환경에서는 uniqid()가 1초 해상도의 UNIX 타임스탬프만 출력할 수 있습니다.

즉, "more_entropy"가 없으면 함수는 절대적으로 끔찍하며 절대 사용해서는 안 됩니다.설명서에 따라 플래그는 "조합된 선형 합동 생성기"를 사용하여 "엔트로피 추가"를 수행합니다.RNG가 매우 약하기 때문에 이 함수는 완전히 생략하고 보안과 무관한 경우에는 적절한 시드를 가진 mt_rand 기반, 보안과 무관한 경우에는 SHA-256을 사용합니다.

more_unique 플래그가 없으면 마이크로초 카운터와 함께 unix 타임스탬프를 반환하기 때문에 2개의 콜이 같은 마이크로초로 발신되면 동일한 '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다소 랜덤한 소수 자릿수를 php_combined_lcg()9자리 추가합니다(는 값을 반환합니다).(0,1)29.9비트의 엔트로피입니다(LCG는 암호학적으로 안전한 의사난수 생성기가 아니기 때문에 아마 더 적을 것입니다).

언급URL : https://stackoverflow.com/questions/4070110/how-unique-is-uniqid