std :: hash가 결정적이라고 보장되지 않는 이유는 무엇입니까?


28

이하에서는 N4140 (C ++ 14 표준)을 사용합니다.


에 따르면 17.6.3.4 해시 요구 사항을 § ,

반환 된 값 k 은 프로그램 기간 동안의 인수에만 의존해야 합니다 .

[참고 : 따라서 h(k)동일한 값을 가진 표현식의 모든 평가 는 주어진 프로그램 실행에 대해k 동일한 결과 산출합니다 . — 끝 참고]

§ 20.9.12 클래스 템플릿 해시 말한다

...

인스턴스화 hash<Key>는 :

(1.1) — 해시 요구 사항 (17.6.3.4)을 충족시킨다 ...

(1.2) — ...


valuehash<decltype(value)>(value), 프로그램을 다시 시작하면 해시 값 (예 :)이 다른 값을 가질 수 있습니다.

그런데 왜? 이 제한은 C ++ 11 표준이 아니라 C ++ 14, C ++ 17 및 C ++ 20 표준에있었습니다. STL 개발자가 아닌 사용자로서 std::hash결정적 이라면 상당히 유용합니다 . 결정적 해시 함수를 구현하는 데 수학적 어려움이 있습니까? 그러나 우리가 매일 사용하는 해시 함수 (예 : 더 이상 사용되지 md5sum않거나 더 안전한 sha256)는 모두 결정적입니다. 효율성에 문제가 있습니까?


7
"... 해시 함수는 프로그램의 단일 실행 내에서 동일한 입력에 대해 동일한 결과를 생성하는 데만 필요합니다. 이는 충돌 서비스 거부 공격을 방지하는 솔트 해시를 허용합니다 ." 출처 : en.cppreference.com/w/cpp/utility/hash
Richard Critten

5
결정적 알고리즘이 비 결정적 입력을 취할 수 있도록합니다. 예를 들어 포인터 값. 불변의 데이터 구조는 내부 데이터의 주소를 해시 할 수 있으며, 이는 콘텐츠를 해시하는 것보다 훨씬 빠릅니다.
John Kugelman

4
이 답변 에는 결정론을 원하지 않는 이유가 있습니다.
NathanOliver

3
이것을 제한으로 위협하지 말고 표준 제약을 덜 엄격하게 만드십시오.
Marek R

4
제약이 완화 된 이유 는 다음과 같습니다 .
Marek R

답변:


17

실행간에 해시 함수를 결정적으로 지정할 필요는 없지만 정렬되지 않은 컨테이너 (예 : 의존하는 동작 인 경우)와 같은 자체 해시를 계속 제공 할 수 있습니다.

cppreference 는 다음 과 같이 말합니다.

해시 함수는 프로그램의 단일 실행 내에서 동일한 입력에 대해 동일한 결과를 생성하는 데만 필요합니다. 이를 통해 충돌 서비스 거부 공격을 방지하는 솔트 해시가 허용됩니다.

경우 Hash요구 사항이 결정적으로 알려줍니다, 당신은 요구 사항을 깨지 않고 소금에 절인 해시를 제공 할 수 없습니다.

여기에 실제 설명이 있습니다.


7

@NathanOliver 가 제안한 이 답변 (및 링크) 은 궁극적으로 도움이됩니다. 중요한 부분을 인용하겠습니다.

비 암호화 해시 함수의 경우 동일한 해시 값으로 대규모 입력을 미리 계산하여 정렬되지 않은 컨테이너를 알고리즘 적으로 느리게하여 서비스 거부 공격을 유발할 수 있습니다.

( 문제 2291에서. std :: hash는 충돌 DoS 공격에 취약합니다 )

이러한 이유로 언어 디자이너는 임의 해싱으로 마이그레이션하고 있습니다. 무작위 해싱에서 문자열“a”의 해시 값은 프로그램을 실행할 때마다 변경 될 수 있습니다. 임의 해싱은 이제 Python (버전 3.3 기준), Ruby (버전 1.9 기준) 및 Perl (버전 5.18 기준)의 기본값입니다.

( 랜덤 해싱을 사용하고 있다는 것을 알고 있습니까? )

허가자조차도 반사판 토론에서 논쟁의 여지가 있기 때문에 즉시보다는 준비로 이동

( 문제 2291에서. std :: hash는 충돌 DoS 공격에 취약합니다 )

실제로, 내가 이해하는 한, std::hash임의의 해싱 을 구현하는 구현은 없지만 자신만을 작성할 수 있습니다 my::secure_hash.

( 이 답변에서 )


추신

방금 "해시 테이블 작업"을 검색하고 유익한 페이지를 찾았 습니다. 전 세계의 모든 서버를 인식하는 순간이 취약합니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.