2012-03-14 2 views
0

두 sha1 해시가 동일한 지 비교하고 싶습니다. 가장 효율적인 방법은 무엇일까요? 현재 memcmp를 사용하려고합니다. 감사.sha1 해시와 동등성을 비교하는 가장 좋은 방법

+3

진짜 질문은해야합니다 : 왜 귀찮게합니까? 당신은 현재 솔루션보다 더 빠른 것이 정말로 필요합니까? SHA1을 비교하는 것이 응용 프로그램에서 병 목이라고 의심 스럽습니다. –

+0

@FerdinandBeyer 우수 지점 – fredoverflow

+0

나는 Ferdinand에 완전히 동의하고 당신이하려는 것은 조기 최적화라고 불려지므로 피해야합니다 ... – Malkocoglu

답변

3

음, 당신이 할 수 있습니다 :,

#include <cstdint> 

bool is_same_sha1(const char* p, const char* q) 
{ 
    const std::uint32_t* a = (const std::uint32_t*)p; 
    const std::uint32_t* b = (const std::uint32_t*)q; 
    return a[0] == b[0] && a[1] == b[1] && a[2] == b[2] 
     && a[3] == b[3] && a[4] == b[4]; 
} 

을하지만 맹목적으로 내 조언을하지 않는 당신이해야 측정 사용자 정의 솔루션에 대한 memcmp 솔루션이며 중요한 성능 이점을 제공하는 경우에만 사용하십시오. memcmp이 매우 더 똑똑하고 더러운 무엇인가를했기 때문에 더 빠르다면 나는 놀라지 않을 것입니다.

+0

이것은 좋은 해결책 인 것 같습니다. 내 사용을 위해 memcmp보다 빠릅니다. 감사. 비록 내가 std :: equal이 어떤 차이를 만들지를 알아야만한다. – polapts

+0

버퍼가 올바르게 정렬되지 않으면이 작업이 실패 할 수 있습니다.(공식적으로 정의되지 않은 동작이기도하지만, 정렬과 같은 외부 제약 조건을 충족시키려는 의도가 있다는 것은 분명합니다. 그렇지 않은 경우 매우 불량한 구현이 될 것입니다.) –

+0

물론 ' uint32_t '를 사용할 수 없습니다. (결국은 이식성의 제약에 달려 있습니다 .'Uint32_t'는 Windows와 Posix 호환 시스템에서 사용할 수 있습니다. 충분히 휴대 가능한 곳에 응용 프로그램이 많이 있습니다.) –

2

memcmp()의 무엇이 잘못 되었나요? 두 해시의 모든 바이트를 비교해야합니다. memcmp()은 찾은 첫 번째 차이점에 빨리 실패합니다. memcmp()은 라이브러리 작성자가 플랫폼에 적합한 선택 항목 인 청크 크기로 작업하도록 작성할 수 있습니다.

+0

나는'std :: equal'가'memcpy'보다 더 빠를 것이라고 기대합니다; 컴파일러는 관련된 정확한 유형을 위해 그것을 생성하고 정렬과 같은 것을 고려할 수도 있습니다. (물론,'memcpy'는'__builtin_memcpy'와 같은 것에 대해'#define '일 가능성이 높기 때문에 컴파일러가 비슷한 최적화를 할 수 있습니다.) –

+0

사실, 경계에 맞추는 것이 중요합니다. 만약 그들이 32 바이트 블럭에 정렬한다면, 그것들을 체크하기위한 단일 SSE-something 명령어 일 수도 있습니다 ... – sarnold

+0

@sarnold 정확하게 160 비트를 비교하는 SSE 명령어가 있습니까? :) 당신은 아마 메모리 (위험한?)에서 overread하고 여분의 비트를 마스크해야 할 것입니다. – fredoverflow

2

std::equal이 가장 적합하지만, memcmp도 사용할 수 있습니다. 효율성과 관련하여 구현에 따라 달라 지지만, (가능하면) 데이터 정의 및 표현 방법에 따라 달라질 수 있습니다. 이미 블록이 얼마나 큰 컴파일 타임에 알고 있기 때문에