는 방법을 찾 multiplier x x*c1c2 지만,x*c1 오버플로우 발생

0

질문

나는 코드를 작성하는 것입니다 찾을 충돌에 대한 std::hash<std::string> 고 노력하고 역의 일부는 해시 계산 단계가 있습니다.

이와 같은 곱하기에 std::hash 구현합니다.

size_t hash2 = shift_mix(hash1) * mul;

hash2 -이전 단계에서,또한 알 mul -it's constant value= 0xc6a4a7935bd1e995UL.

shift_mix(hash1) * mul 인 오버플로우(hash2 / mul = 0다),그래서 그만 마지막 64 비트의 곱셈 결과입니다.

그래서 나는 방법이 필요를 찾아의 많은 변종 shift_mix(hash1) 을 만족하는 평등. 가장 좋은 방법은 무엇을 할까? 아마도 어떻게 든 사용 __int128_t?

c++ hash stdhash
2021-11-23 19:31:15
1

최고의 응답

2

곱하기 홀수로 모듈에는 두 개의 전원이 반전,그래서 당신이 할 수있는"취소"그것은 완벽하게하지 않고,여러 옵션이 나타납니다. 그러나 사단이 작동하지 않는 후에 포장해야 합 곱하여 승법 역의 mul 모 264는 0x5f7a0ea7e59b19bd 이 경우. 0x5f7a0ea7e59b19bd * 0xc6a4a7935bd1e995 = 1.

uint64_t mul_inv = 0x5f7a0ea7e59b19bd;
uint64_t hash1 = unshift_mix(hash2 * mul_inv);
2021-11-23 19:41:58

다른 언어로

이 페이지는 다른 언어로되어 있습니다

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................