2013-04-27 1 views
10

동일한 std::type_info::hash_code() 값이 동일한 유형을 의미한다고 보장 할 예정입니까? std :: type_info :: hash_code()의 고유성과 의미 "should"

Cplusplus.com

그래서 항 같다 :

이 기능하지 가지 유형 대한 동등 비교 목적있는 type_info 두 과 상이한 값에 대해 동일한 값을 반환한다. [강조 광산]

Cppreference 그렇지 항 같다 :

동일한 유형을 참조하여 오브젝트의 동일 불특정 값을 반환. 다른 보증이 제공되지 않습니다. 특히 동일한 프로그램의 호출간에 값이 변경 될 수 있습니다. [강조 광산]

관련 표준 단락은 :

§의 p18.7.1 p7-8

를 size_t의 hash_code() CONST noexcept 단계;

7 반환 값 : 프로그램의 단일 실행 내에서 equal을 비교하는 두 개의 type_info 객체에 대해 동일한 값을 반환한다는 점을 제외하고는 지정되지 않은 값.

8 참고 : 구현 이 같음을 비교하지 않는 두 개의 type_info 개체에 대해 다른 값을 반환해야합니다. [강조 광산]

"한다"위의 컨텍스트에 있어야의 의미는 무엇입니까? 8 단락이 요구 사항이라면 런타임에서 프로그램의 모든 심볼 이름에 대해 일종의 글로벌 유니 케이킹을 수행하지 않으면 해시 충돌이 발생하지 않게되며 이는 표준에 큰 부담으로 여겨집니다 구현시에, 특히 hash_code()이라는 함수에 대해 강요합니다. (실제로 Itanium은 이것을 요구하지만 표준보다 명시 적으로 여분의 요구 사항입니다.) "should"은 바인딩을위한 것이 아니기 때문에이 주석은 표준에 대한 무의미한 결함 인 것처럼 보입니다. 어쨌든 의존 할 수없는 어려운 요구 사항을 충족 시키려고 구현체에 요구하는 것은 가치가 없으므로 혼동과 단편화를 유발할뿐입니다. 누구나 왜 거기 있는지 알아?

편집 : 어쩌면 "결함"단어 너무 강한,하지만 분명히 적어도 하나 개의 참조 사이트를 오도하고 이적으로 그것에 의존하는 사람을 잘못 인도 이후 적어도 그것은 명확히해야 혼동의 포인트는입니다. 또한 실행시 전역 고유화가 수행되는 경우 구현을 지원하는 유형이 size_t 범위보다 작은 경우 해당 요구 사항을 충족하려면 실제로 이며 가능한 경우 표준이 제안하려고하는지 명확하지 않습니다. 이것이 이상적인 구현 전략인지 여부.

답변

5

의미가 꽤 분명해 보입니다. 어떤 상황에서는 만나기가 불가능할 수 있기 때문에 절대적인 요구 사항은 아니지만 구현은 가능한 한 고유 한 값을 생성하려고 시도해야합니다.

일반적으로 해시 코드의 경우에도 마찬가지입니다. 고유 한 값을 생성하려고 시도하지만 항상 가능한 것은 아닙니다.

표준에는 적용 할 수없는 정보 인 로트이 포함되어 있습니다. 꽤 많은 비트 (분명히 모든 것은 아님)는 명시적인 형태 인 Note입니다.하지만 비 규범 적 외부의 모든 것이 결함이라는 것을 의미하지는 않습니다.

편집 : ISO가 표준 작성 방법에 대해 말하는 것을 알고 싶다면 page of guidelines입니다.

+0

좋아, 나는 네가 맞다고 생각하지만, 혼란 스럽다. 한 가지 예로'cplusplus.com '은 오류가 있으며 그것에 의존하는 누구나 버그가있는 코드가 있습니다. –

+0

(적어도 명확해야합니다) –

+4

@StephenLin : cplusplus.com에 오류가 있다는 데 동의합니다. 특별히 정확한 것으로 알려져 있지 않습니다. cppreference.com은 최소한 일반적인 규칙으로는 더 신뢰할만한 것으로 보입니다. –