약 20 억 개의 문자열에 해시를 저장하고 싶습니다. 그 목적을 위해 가능한 한 적은 저장 공간을 사용하고 싶습니다.해시를 자르는 것이 안전합니까?
해시를 일련의 16 진수 (예 : md5 해시)로 반환하는 이상적인 해싱 알고리즘을 고려해보십시오. 나는 생각하기에 이것은 길이가 8 심볼 이하가되도록 해시가 필요하다는 것을 의미한다. 그러한 해시는 4+ 억 (16 * 16 * 16 * 16 * 16 * 16 * 16 * 16) 개의 고유 문자열을 해싱 할 수 있기 때문에 가능합니다.
그래서 공간을 절약하기 위해 해시를 일정 길이로 자르는 것이 안전한지 알고 싶습니다. (해시는 물론 충돌하지 않아야합니다.)
예/아니요/어쩌면 - 관련 연구에 대한 설명 또는 링크가있는 답변을 주시면 감사하겠습니다.
p.s. 8 문자 해시가 20 억 개의 문자열을 저장할 수 있는지 여부를 테스트 할 수 있습니다. 하지만 20 억 개의 해시를 20 억 개의 잘라 버린 버전과 비교해야합니다. 나에게 사소한 것처럼 보이지 않기 때문에 내가 그렇게하기 전에 더 잘 물어볼 것입니다.
참고 : 해시를 8 바이트 * 문자열로 저장 *는 1 << 32 개의 다른 값만 허용합니다. 일반 64 비트 int는 1 << 64 개의 다른 값을 허용합니다. – wildplasser
20 비트 문자열의 32 비트 해시에는 충돌이 포함되지 않을 가능성이 매우 낮습니다. –
대략적인 경험 법칙 : 충돌없이'n '을 해싱하기 위해서는'n^2' bin이 필요합니다. '2^31' 문자열을 가지고 있다면, 충돌을 피하기 위해서'2^62' bin이 필요합니다. –