วิธีที่จะตามหา multiplier x หาก x*c1=c2 แต่ x*c1 ทำให้เอ่อล้นออกมา

0

คำถาม

ผมเรื่องเขียนรหัสโปรแกรมที่จะค้นหาสำหรับคอลลิชัน std::hash<std::string> และพยายามที่จะย้อนกลับบางอย่างค่อยจัดการเรื่องขั้นตอนการคำนวณ.

นี่เป็นการคูณอยู่ std::hash implementation.

size_t hash2 = shift_mix(hash1) * mul;

ฉันรู้ว่า hash2 -จากคนก่อนขั้นเหมือนกันฉันรู้ mul -มันเป็นอย่างต่อเนื่องค่า= 0xc6a4a7935bd1e995UL.

shift_mix(hash1) * mul ทำให้เอ่อล้นออกมา(hash2 / mul = 0)ดังนั้นมันต้องใช้เพียงสุดท้าย 64 บิตของคูณค่าผลลัพธ์.

ดังนั้นฉันต้องหาทางเพื่อหาหลายของ variants shift_mix(hash1) ซึ่งพอใจความเท่าเทียม. อะไรคือหนทางที่ดีที่สุดที่จะทำมัน? บางทีอาจจะใช้ __int128_t?

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

คำตอบที่ดีที่สุด

2

คูณด้วยแปลกเศษการหารจำนวนเป็นพลังขอสองคนเป็น invertible ดังนั้นคุณสามารถ"เลิกทำ"มันอย่างสมบูรณ์แบบมีหลายตัวเลือกการปรากฎตัวขึ้นมา อย่างไรก็ตามดิวิชั่นไม่ได้ทำงานหลังจากห่อคุณต้องเพิ่มพูนขึ้น\โดย multiplicative กลับค่าของ 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ý
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่