64 비트에서 128 비트로 갈수록 충돌 가능성이 크게 줄어들 기 때문에 MD5128을 사용하는 것이 좋습니다.
Max entries before X chance of collision
Bits 10e−18 10e−15 10e−12 10e−9 10e−6 0.1% 1% 25% 50% 75%
----------------------------------------------------------------------------------------------
16 2 2 2 2 2 11 36 1.9e2 3.0e2 4.3e2
32 2 2 2 2.9 93 2.9e3 9.3e3 5.0e4 7.7e4 1.1e5
64 6.1 1.9e2 6.1e3 1.9e5 6.1e6 1.9e8 6.1e8 3.3e9 5.1e9 7.2e9
128 2.6e10 8.2e11 2.6e13 8.2e14 2.6e16 8.3e17 2.6e18 1.4e19 2.2e19 3.1e19
256 4.8e29 1.5e31 4.8e32 1.5e34 4.8e35 1.5e37 4.8e37 2.6e38 4.0e38 5.7e38
384 8.9e48 2.8e50 8.9e51 2.8e53 8.9e54 2.8e56 8.9e56 4.8e57 7.4e57 1.0e58
512 1.6e68 5.2e69 1.6e71 5.2e72 1.6e74 5.2e75 1.6e76 8.8e76 1.4e77 1.9e77
그래서 35000 (3.5e4) 문자열로, 64 비트 해시, 이것은 당신에게 10E^-12 10E 충돌을 가지고^-9 기회 사이에 뭔가를 제공합니다. 이것은 매우 높은 것처럼 보이지 않을 수도 있지만 해시와 관련하여 10 억 개 중 1 개는 적중하기 쉽습니다.
128 비트로 증가하면 (10 억 억 달러) 1에서 상당히 줄어 듭니다.
번호 매기기가 바람직하지 않은 이유에 대해 자세히 설명해 주시겠습니까?하지만 64 비트 해시로 깨는 것이 바람직합니다. – corsiKa
나는 추가 된 여분의 문자열이나 삭제의 사소한 수정으로 키 값 (즉, 해쉬)을 불변으로하고 싶다. 문자열 집합은 때때로 (나를 제외한) 업데이트되며 저장 해시 값의 의미를 유지하기를 원합니다. –
음. 결국 새로운 항목을 추가 할 수 없으며 삭제 된 항목의 색인을 "폐기"할 수 있습니까? 기본 키를 증가시키면서 데이터베이스 테이블에 대해 꽤 잘 작동합니다. 필자가 보게되는 문제는 문자열 값에서 인덱스로의 검색 비용입니다 (Trie, BST 또는 역설적으로 해시 테이블을 원할 것입니다.이 중 하나는 절약하려는 것보다 많은 메모리를 차지할 수 있습니다). 세트. –