2013-03-22 1 views
0

typeid(). hash_code()가 반환하는 size_t를 상수 크기 16 비트 부호없는 정수로 저장하는 것이 안전하다고 생각할 수 있는지 알고 싶습니다. 아마도 충돌을 일으킬 것입니다. 가장 안전한 모드는 무엇입니까?16 비트 정수에 typeid(). hash_code()를 저장

감사합니다.

+0

그 크기는 size_t의 크기에 크게 좌우 될 것입니다. – Nick

+0

예, 알고 있습니다. size_t는 16 비트 또는 더 작을 수 있으므로 괜찮을 수 있습니다. 하지만 size_t가 보통 32 비트 또는 64 비트이면 어떨까요? 불가능한 버그를 복잡한 코드에 도입하고 싶지 않습니다! – DarioP

+0

Likely는 상대적인 용어입니다. 그러나 * n * 비트 값을 사용하여 * m * 비트 값으로 압축하면 (즉, * n> m *) 충돌이 발생한다는 것은 상당히 직관적이어야합니다 . 이러한 충돌의 빈도는 많은 것들에 달려 있습니다.이 모든 것들은 (이 경우) 모든 의도와 목적을 위해 정의되지 않았습니다. –

답변

4

충돌 가능성이 있으며 안전합니다. 충돌에 대해서는 "안전하지 않은"것이 없습니다. 충돌은 해시가 충돌하는 경우 더 많은 전체 값을 비교해야하기 때문에 성능이 약간 저하됩니다.

일치하지 않는 해시 코드는 값이 일치하지 않도록합니다. 일치하는 해시 코드는 이들이 동일 할 수 있음을 의미합니다. 해시 코드는 필요한 전체 비교 수를 줄이는 데 사용됩니다. 해시 코드가 일치하는 값만 비교하면됩니다.

+0

답을 문맥에 기입하십시오. 1) 충돌을 감지하면 미리 모든 해시를 계산합니다. 2) 충돌을 해결하는 것은 전체 값을 비교하는 것만으로 간단하지는 않지만 두 번째 유형에 다른 해시를 할당해야합니다. 그런 다음 typeid (type2) .hash_code()를 더 이상 사용할 수 없지만 이것을 포장해야합니다. 함수를 수정하여 올바른 수정 값을 반환합니다. 이것은 정말로가는 길입니까? – DarioP

+2

@DarioP : 1) 아니요. 2) 그렇습니다. (typeid (type2) hash_code()를 사용하여 필요한 비교 횟수를 줄일 수 있습니다. 가능한 모든 typeid와 비교하는 것보다는 hash_code가 동일한 항목을 비교하는 것만으로도됩니다. - 종종 1.) –

+0

@DarioP "reduced"해시가 'type1'의 "reduced"해시와 일치하는 경우 왜 다른 해시 값을'type2'에 할당해야합니까? "16 비트 해시 코드"를 사용하려고 시도한 것을 설명하면 도움이됩니다. –