2013-05-03 2 views
3

PHP가 데이터베이스 테이블에 생성 한 고유 ID를 사용하고 싶습니다.이 ID는 결코 10,000 개가 넘는 레코드를 가질 수 없습니다.고유 ID에 해시를 사용하는 것이 잘못 되었습니까?

sha1(uniqid(mt_rand(), true)) 

잘못인가를 고유 ID의 해시를 사용하는 : 내가 사용하고, 그래서 나는 창조의 시간을 볼 수 또는 순수하게 숫자 값을 사용하지 않으려는? 모든 해시가 충돌로 이어지거나이 경우 고려되어서는 안되는 너무 먼 거리의 기회입니까?

추가 포인트 : 해시 할 문자 수가 sha1 해시의 문자 수보다 작 으면 항상 고유하지 않습니까?

+3

아니요, 틀리지 않습니다. sha1에 타임 스탬프를 전달하면 좋을 것입니다. – wayne

+1

이것은 좋은 읽을 수 있습니다 :: http://stackoverflow.com/questions/2768191/hash-of-unique-value-unique-hash –

+0

왜 고유 한 ID를 만드시겠습니까? 데이터베이스가 자동 증가 기본 키를 지원하지 않습니까? 이는 일반적으로 데이터베이스 식별자에 대해 고유 한 ID를 갖는 방법으로 받아 들여집니다. –

답변

4

당신이 충돌, 1^2 X 확률의 이론적 인 최상의 시나리오를해야합니다 : 여기

은 확률이 정말 무엇인지 질문/답변입니다 해시 알고리즘의 비트 수입니다. 가장 좋은 경우는 입력이 일반적으로 전체 charset을 사용하지 않는 ASCII가되고 해시 함수가 완벽하게 분산되지 않으므로 실생활에서 이론상 최대치보다 더 자주 충돌합니다.

은 당신의 마지막 질문에 대답하려면 :

또 다른 점 : 해시되는 문자의 수는 SHA1 해시의 문자 수는 보다 작은 경우, 항상 고유하지 않을 것인가?

네, 그게 사실입니다. 그러나 그 크기의 고유 한 키를 생성하는 또 다른 문제점이 있습니다. 가장 쉬운 방법은 일반적으로 체크섬이므로 충돌 공간이 사용자의 편의를 위해 충분히 작을 정도로 충분히 큰 다이제스트를 선택하십시오.

@wayne은 제시 한대로 microtime()을 임의의 소금 (및 base64_encode 및 엔트로피를 높이기 위해)에 연결하는 방법을 사용합니다.

+1

고맙습니다. 그럴 수 있습니다 : sha1 (base64_encode (microtime(). uniqid (mt_rand(), true))) – texelate

+1

@texelate 이는 좋은 출발점이 될 것입니다. 염화에 대한 자세한 내용은이 페이지 요점 1과 2를 참조하십시오. http://blog.ircmaxell.com/2012/12/seven-ways-to-screw-up-bcrypt.html –

+0

감사. 나는 보안보다는 독창성을 필요로하지만 매우 유용합니다. – texelate

3

2 명이 동일하게되면 얼마나 무섭겠습니까? Murphy 's Law가 적용됩니다. 백만 분의 1, 또는 심지어 100,000 : 1의 기회가 허용되는 경우, 바로 앞으로 나아가십시오! 실제 기회는 훨씬 더 작습니다. 그러나 시스템이 폭발하면 시스템의 설계 결함을 먼저 해결해야합니다. 그런 다음 자신감을 가지고 진행하십시오. X는을이다 당신이이 키가있는 경우 Probability of SHA1 Collisions

2

대신 sha1 (time())을 사용하면 sha1 해시보다 짧은 시간을 나타내는 한 반복되는 해시가 무작위로 제거됩니다.

+4

'그러면 해시가 반복되는 무작위 가능성을 제거합니다 .. 두 개 이상의 객체 pr을 인스턴스화하지 않으면. 두 번째 - 그것은 많은 IMHO가 아니다. 고유 키에 대한 입력으로 타임 스탬프를 사용하는 것이 좋습니다. –

0

당신은이 클래스를
http://blog.kevburnsjr.com/php-unique-hash

당신이 필요가 없습니다 그 방법을 사용하여 테이블의 정수 기본 키에서 겉으로는 임의 가역 식별자를 생성 할 수 있습니다) (가능성이 더 이상 당신은 작업 PHP 파서을 찾을 수 채우기보다) 해시를 저장 (또는 색인화)하거나 충돌에 대해 걱정할 필요가 없습니다.

+1

링크가 손상되었습니다. –

2

컴퓨터 무작위는 실제로 무작위가 아닙니다. Unix 환경에 있다고 가정 할 때 컴퓨터에서 얻을 수있는 유일한 진정한 무작위는 /dev/random이지만, 이것은 마우스 이동이나 키보드 입력과 같은 사용자 상호 작용에 의존하는 차단 작업입니다. /dev/urandom에서 읽기가 덜 안전하지만 ASCII 문자를 사용하는 것이 더 좋을뿐 아니라 즉각적인 응답을 제공합니다.

관련 문제