2013-03-17 2 views
2

원래 md5 알고리즘이 128 비트 해시를 생성한다는 것을 알고 있습니다.C++ OpenSSL : md5 기반 64 비트 해시

Mark Adler 님의 의견을 따르면 here 좋은 64 비트 해시를 얻는 데 관심이 있습니다. OpenSSL을 사용하여 md5 기반 64 비트 해시를 만드는 방법이 있습니까? (md5는 내 필요에 대해 충분히 좋아 보인다.) 그렇지 않은 경우 OpenSSL 라이브러리에 구현 된 알고리즘 중 md5보다 품질이 좋은 작업을 수행 할 수있는 다른 알고리즘이 있습니까 (길이는 제외)?

+0

"좋음"을 정의 하시겠습니까? – Thomas

+0

최소한 md5만큼. – Subway

+0

내 말은, 해시 함수에서 어떤 기준이 필요한가요? 속도? 암호 강도? 해시 공간 전체에 걸쳐 균일 한 분포? 충돌 가능성이 낮음? 단일 비트 변경 민감도? – Thomas

답변

2

나는 '해시 품질'이 해시 길이와 강하게 관련되어 있다고 주장한다. AFAIK는 OpenSSL이는 64 비트 해시 algos을 가지고 있지 않기 때문에 내가 가진 첫번째 생각은 아마 쓸모없는 간단하고 :

halfMD5 = md5.hiQuadWord^md5.lowQuadWord

마지막으로, 나는 단순히 crc64 같은 적절한 출력하는 알고리즘을 사용하십시오.

일부 crc64 소스

은 확인합니다 :


편집

그러나 지금까지 운없이 그것을위한 친절한 C++ 구현을 찾기 위해 노력하고있어 완벽한 보인다. BTW, 나는 이것이 데이터베이스의 중복 검사를위한 좋은 해시이기 때문에 궁금합니다. 어떻게 OpenSSL과 같은 일반적인 opensource 라이브러리가 API를 제공합니까? - 지하철

이것은 단순히 OpenSSL이 적절한 암호 특성을 사용하는 큰 해시 값을 사용하는 암호 라이브러리이기 때문일 수 있습니다.

데이터 구조에 대한 해시 알 고는 다른 주요 목표가 있습니다. 작은 해시 값이 0, 하나 또는 여러 개의 (충돌하는) 요소가 들어있는 버킷 목록에 대한 인덱스로 사용되는 해시 테이블의 우수한 배포 특성.

그래서, 충돌 여부, 장소, 방법 및 위치가 중요합니다. 일반적인 DBMS에서 열의 색인은 그 자체를 처리합니다.

해당 용기 (지도 또는 세트) :

고유 한 제약 조건은 동등한 D 내용량 :


, 파일 내용 (일반 텍스트, 비 암호화 응용 프로그램) 및 체크섬이있는 테이블이 있거나 매핑 또는 일관성 검사를위한 해시 값. 새 파일을 삽입하려고합니다. 이를 위해 해시 값이나 체크섬을 미리 계산하고 해시 값이나 체크섬이 같은 기존 파일을 쿼리합니다. 존재하지 않으면 충돌이 발생하지 않고 삽입이 안전합니다. 하나 이상의 기존 레코드가있는 경우 정확하게 일치하는 확률이 높으며 '실제'충돌이 발생할 확률이 낮습니다. 케이스에 충돌

  • 하나가 매칭/컨텐츠 충돌의 가능성이 존재하는 기록 해시 컬럼에 고유 제한을 추가하고 재사용 할 수 생략한다. 여기에서 '젠킨스 (Jenkins)'와 같은 데이터베이스 친화적 해시 알 고개를 원할 것입니다.

  • 충돌을 처리해야하는 경우 일반 텍스트 열에 고유 제한 조건을 추가 할 수 있습니다. crc와 같은 데이터베이스 친화적 인 체크섬 algos는 레코드 간의 충돌에 영향을 미치지 않으며 탐지 할 특정 유형의 손상 또는 기타 요구 사항에 따라 선택할 수 있습니다. 처음에 언급 한 것처럼 md5의 XOR로 묶인 쿼드 워드를 사용할 수도 있습니다.

몇 가지 다른 생각은 :

일반 텍스트 컬럼에 인덱스/제약 매핑을 수행하는 경우
  • , 어떤 해시 값은 잠재적 인 일치를 찾기 위해 합리적으로 빠른 검색을 수행 할 수 있습니다.
  • 아무도 당신에게지도 친숙한 해시와 체크섬을 추가하지 못하게 할 것입니다.
  • 고유 제약 조건은 기본적으로 위에 언급 된 해시 테이블과 같은 인덱스를 추가합니다.

간단히 말해서, 64 비트 해시 알 고를 사용하여 정확히 무엇을 달성하고자하는지에 달려 있습니다.

+0

응답 해 주셔서 감사합니다. 당신은 절대적으로 정확하지만, 내가 필요로하는 것은 작은 데이터베이스에 대한 충돌을 막는 알고리즘이다. md5는 데이터베이스에 대해^32 배 더 크다. (만일 내가 당신의 질문에 언급 한 링크로 가서 "좋은 해시 알고리즘 "당신은 아마 내가 무슨 뜻인지) 볼 것이다. 알았어. – Subway

+0

. 예를 들어 젠킨스는 다음 작업을해야합니까? : http://en.m.wikipedia.org/wiki/List_of_hash_functions#section_3 – Sam

+0

얼핏보기에 겐 젠킨스는 완벽 해 보이지만 지금까지는 운이 좋지 않은 친숙한 C++ 구현을 찾으려고합니다. BTW, 나는 이것이 데이터베이스의 중복 검사를위한 좋은 해시이기 때문에 궁금합니다. 어떻게 OpenSSL과 같은 일반적인 opensource 라이브러리가 API를 제공합니까? – Subway