เหตุใดจึงใช้ '397' สำหรับการแทนที่ ReSharper GetHashCode


150

เช่นเดียวกับคุณหลายคนฉันใช้ ReSharper เพื่อเร่งกระบวนการพัฒนา เมื่อคุณใช้เพื่อแทนที่สมาชิกที่เท่าเทียมกันของคลาสรหัส -gen ที่สร้างขึ้นสำหรับ GetHashCode () ดูเหมือนว่า:

    public override int GetHashCode()
    {
        unchecked
        {
            int result = (Key != null ? Key.GetHashCode() : 0);
            result = (result * 397) ^ (EditableProperty != null ? EditableProperty.GetHashCode() : 0);
            result = (result * 397) ^ ObjectId;
            return result;
        }
    }

แน่นอนว่าฉันมีสมาชิกบางคนในนั้น แต่สิ่งที่ฉันอยากรู้คือ 397 ทำไม

  • แก้ไข: ดังนั้นคำถามของฉันจะดีกว่าคำว่ามีอะไรพิเศษ 'เกี่ยวกับ 397 จำนวนเฉพาะนอกมันเป็นจำนวนเฉพาะหรือไม่

คำตอบ:


166

อาจเป็นเพราะ 397 เป็นขนาดที่ใหญ่พอที่จะทำให้ตัวแปรผลลัพธ์ล้นและผสมบิตของแฮชบ้างเพื่อให้มีการแจกจ่ายรหัสแฮชที่ดีขึ้น ไม่มีอะไรพิเศษเป็นพิเศษเกี่ยวกับ 397 ที่แตกต่างจากช่วงเวลาอื่นที่มีขนาดเท่ากัน


73
และ 397 มีความสุข เราทุกคนไม่ต้องการเพียงแค่มีความสุขใช่ไหม
รัสเซล B

2
โอเค แต่ทำไมมันถึงต้องเป็นนายกและทำไมมันถึงต้องมีขนาดที่แน่นอน ถ้ามันต้องเป็นนายกทำไมไม่ 2 หรือ 2147483647 ฉันเดาว่าจะได้การกลายพันธุ์ที่ดี (และเหตุผลเดียวสำหรับการคูณนี้คือการกลายพันธุ์) เราไม่จำเป็นต้องมีจำนวนเฉพาะ เราต้องการตัวคูณเพื่อให้มีจำนวนหรือศูนย์และจำนวนที่เท่ากันโดยเฉพาะอย่างยิ่งไม่มีรูปแบบที่ชัดเจน 397 = ความสอดคล้อง 110001101b ยังไม่แน่ใจเกี่ยวกับขนาด
Andriy K

5
อย่างที่ Nick พูดไม่มีอะไรพิเศษเป็นพิเศษเกี่ยวกับเรื่องนี้ ไม่จำเป็นต้องเป็นขนาดนั้นนั่นเป็นเพียงตัวเลขที่มีขนาดใหญ่พอที่เมื่อคุณคำนวณแฮชผลลัพธ์จะล้น (เนื่องจาก GetHashCode () ส่งคืน Int32) การเลือกไพร์มนั้นมีประโยชน์สำหรับการแจกแจงฉันไม่มีปริญญาคณิตศาสตร์ดังนั้นฉันจะไม่พยายามอธิบาย แต่การคูณด้วยไพร์มจะได้ผลลัพธ์ที่กระจายได้ดีกว่าการคูณด้วยเลขใด ๆ
Ben Randall

16

แฮที่ resharper ใช้ดูเหมือนจะแตกต่างจากแฮFNV FNV มีการใช้งานบ่อยครั้งในช่วงเวลาที่แตกต่างกัน มีการอภิปรายเกี่ยวกับการเลือกที่เหมาะสมของช่วงเวลาสำหรับ FNV เป็นที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.