2010-05-04 4 views
3

이론적으로 고유 값을 해싱하면 고유 값이 생성됩니까?고유 값 해시 = 고유 해시?

두 개의 열 (id 및 code)이있는 DB 테이블이 있다고 가정 해 보겠습니다. id는 자동 증가 int이고 코드는 varchar입니다. 내가한다면 ...

... $ id와 같은 행에 $ 코드를 저장합니다. 내 코드 열은 고유 한 것입니까?

현재 시간을 추가하면 어떨까요? 예 :

$code = sha1($id . time()); 

감사합니다.

+0

확실한 말을 할 수는 없지만 sha1 함수에 대한 유한 수 # 출력이 있으므로 해시가 고유하다고 보장 할 수는 없다고 생각합니다. 이것은 잠재적 인 키의 수가 무한하기 때문에 암호화 할 때 특정 키가 동일한 값으로 매핑되어야 함을 의미합니다. 나는 sha1 알고리즘의 내부 구조를 알지 못한다. 그래서 1과 데이터베이스 번호 열의 최대 값 해쉬 값이 같은 값을 가지면 말할 수 없다. 누군가는 그 질문에 대한 답을 알고 있을지 모르지만 다른 방법을 사용하는 것이 더 나을 것이라고 생각합니다. $ code = uniqid()? –

+0

고맙습니다. 나는 uniqid()에 대해 몰랐다. 나는 확실히 살펴볼 것이다. – nebs

답변

7

일반적으로 대답은 '아니오'입니다. SHA-1에는 2 160 개의 다른 출력 (160 비트)이 있지만 더 많은 입력이 있습니다 (예 : 2^320 개의 40 바이트 문자열이 있고 모두에 매핑 할 수는 없습니다). 고유 한 출력).

값의 충분한 하위 집합이 주어지면 그 답은 아마도 것입니다. 정확한 알고리즘과 하위 집합의 크기에 따라 다릅니다. 가능한 입력 수가 가능한 출력 수보다 작 으면 가능하지만 보장 할 수 없습니다. 이것을 생각할 때 birthday paradox을 유지하는 것이 도움이 될 수 있습니다. 충돌 확률이 입력 횟수에 따라 선형 적으로 증가하지는 않습니다.

+0

감사. 고유 한 값을 얻는 유일한 방법은 DB를 통해 생성 및 검색하여 존재 여부를 확인하는 것입니다 (예이면 반복). 그게 내가 여기에서하는 것을 피하려고 노력한 것입니다. 그러나 그것이 유일한 방법이라고 생각합니다. – nebs

+0

불행히도 고유 한 가치를 보장하고 싶다면 다른 방법은 없습니다. 이것은 해시를 쉽게 되돌릴 수없는 이유이기도합니다. "1"에 대한 SHA-1 해시는 "356a192b7913b04c54574d18c28d46e6395428ab"이지만 그 해시를 생성하는 다른 많은 값이 있습니다. –

+0

나는 본다. 것은 아마도 1000 개 이상의 고유 한 값을 생성하는 것 이상을 생성 할 필요가 없을 것입니다. 이 경우 모든 값이 고유 할 것이라고 말하는 것이 안전할까요? – nebs

-1

해시 알고리즘에 따라 다릅니다. 그러나 이론적으로 해시가 원본 문자열과 정확히 동일하지 않으면 해시가 고유하지 않을 가능성이 있습니다.

값의 해시는 원래 값의 압축 된 표현입니다. 정보를 제거하여 해시를 생성하면 도메인에서 고유하게 만드는 부분을 잃어 버리므로 값이 고유하지 않을 확률이 높아집니다. 유일 할 것이라고 보장하는 유일한 방법은 원래 값 자체를 사용하여 해시의 목적을 무효화하는 것입니다.

+0

"고유함을 보장하는 유일한 방법은 원래 값 자체를 사용하는 것입니다."- 분명히 사실이 아닙니다! –

+0

@ 마틴 - 무슨 뜻인지 설명해 주시겠습니까? _ 왜 내 진술은 사실이 아닙니까? –

+0

해시가 독창성을 보장 할 원래 문자열 일 필요는 없습니다. 예를 들어 원래의 문자열 인 ROT13 일 수도 있고 여전히 고유 한 문자열 일 수도 있습니다. –

0

두 개의 다른 값이 동일한 해시를 제공 할 가능성은 거의 없습니다. 아주 작지만, 그렇게 쉽지는 않습니다.

-1

왜이 질문을해야 하나? 데이터베이스가 이미 고유 식별자를 제공하고있는 경우 왜 다른 고유 식별자를 생성해야합니까?

PHP 이외의 많은 데이터베이스 엔진이 필요한 경우 사용자에게 UUID 스타일 기본 키를 생성한다고 생각할 수도 있습니다.

여기서 중요한 점은 sha1()과 같은 해시 알고리즘은 이러한 유형의 작업을위한 것이 아니라는 점입니다. 두 개의 (잠재적으로 매우 긴) 문자열 입력이 동일하다는 것을 검증하기위한 것입니다. 유사하지만 정확한 문자열과의 충돌 가능성은 매우 희박하지만 매우 다른 문자열과의 충돌 가능성은 훨씬 높아집니다.

+0

왜 downvote? –