2015-01-08 9 views
1

나는 프로세스를 사용하여 사용자 프로필 이미지에 이름을 지정하고 있으며 충돌을 두려워합니다. 내가 사용하고 이름 패턴은 다음과 같이 정수 범위는 에서입니다중복 여부를 확인하지 않고 키 생성 프로세스를 신뢰할 수 있습니까?

4533381_1284948_8023255.jpg

: 그래서 이미지가 같이 이름이 지정됩니다

9999999_9999999_9999999

을 1.000.000 ~ 9.999.999 사용자 프로필에 같은 이름의 이미지가 이미 있는지 확인해야합니다 이미지 디렉토리? (모든 이미지가 동일한 디렉토리 레벨에 상주한다고 가정).

정수는 충돌 mt_rand(1000000,9999999);

+0

[birthday paradox] (http://en.wikipedia.org/wiki/Birthday_problem)에 대해 읽어보십시오. 당신은 충돌의 확률이 얼마나 빨리 성장하는지에 놀랄 것입니다. 당신은 "임의의"파일 이름을 만들어서는 안됩니다. 결정적인 것을 사용하십시오. 사용자의 ID가 소금에 절인 sha1 해시는 "임의"수보다 훨씬 더 독특합니다. –

+0

db, 자동 증가 고유 ID 아마도. –

답변

1

확률이 매우 낮은 케이스 인 PHP 함수 (비록 가능)를 사용하여 생성된다.

  • 이미지 이름의 가능한 모든 값을 계산 : (9999999-1000000+1)^3 == 7.29 * 10^20.

    힌트 : 당신이 09999999과 왼쪽 패딩 문자열로 변환하는 동안 제로로를 사이에 예컨대 생성 번호로이 값을 증가시킬 수있다 : sprintf("%07d", $number)

  • mt_rand은 상대적으로 좋은 무작위 생성기입니다.

충돌은 아마이 발생하지 않습니다. 이 앱의 맥락에서 쉽게 경우


그러나, 당신은 이름이 비어있는 검사를 구현할 수 있으며, 그렇지 않은 경우, 그냥 같은 방법으로 임의의 이름을 다시 생성합니다.

일종의 do { $name = generate_name(); } while(is_occupied($name)); 루프. 이 솔루션 댓글에 제안 결정 해시보다 안전 것을


참고.

이유는 해시 충돌이 가능하기 때문이며 그럴 경우 완료됩니다. 결정적이며 다른 임의의 생성 할 가능성이 없습니다.

또는 충돌의 경우 해시 함수 체인을 사용해야합니다. 이는 비슷한 do-while 루프를 의미하지만 해시가 계산되는 데이터와 카운터 (해시 계산에 영향을 미침)와 관련된 다소 복잡합니다. 혜택이없는 코드가 더 많습니다.

+0

이것은 내가 찾고있는 정확한 유형의 설명입니다. 사용자가 해당 이미지를 변경할 수 있기 때문에 나는 이미지를 user_id에 묶고 싶지 않습니다. 브라우저 현금과 질문에서 벗어나는 다른 많은 문제에 대해 문제가 생깁니다. 나는 이미지의 수가 250 억을 초과하지 않는다면 (생일의 역설에 따르면) 나는이 방법에 아무런 문제가 없을 것이라고 생각한다. 당신의 대답에 감사드립니다. – BigBlast

0

간단한 답 : 제

긴 대답 : 심지어 숫자와 문자 32 자리 임의의 문자열로, 당신은 결국 가능한 충돌에 타격을 줄 것으로 예상된다.누군가가 주석을 달기 때문에 사용자 ID와 같은 사용자 관련 항목을 사용하고 해시 (hasher) 형식을 사용하여 해시를 시도해야합니다.

PHP에서 해시를 사용하는 경우 here을 참조하십시오.