hashCode ใช้ทำอะไร มันเป็นเอกลักษณ์หรือไม่?


129

ฉันสังเกตเห็นว่ามีgetHashCode()วิธีในการควบคุมทุกรายการใน WP7 ซึ่งกลับลำดับของตัวเลข ฉันสามารถใช้แฮชโค้ดนี้เพื่อระบุรายการได้ไหม ตัวอย่างเช่นฉันต้องการระบุรูปภาพหรือเพลงในอุปกรณ์และตรวจสอบว่าอยู่ที่ไหน สิ่งนี้สามารถทำได้ถ้า hashcode ที่ให้สำหรับรายการเฉพาะนั้นไม่ซ้ำกัน

คุณช่วยอธิบายให้ฉันฟังว่า hashCode นั้นgetHashCode()ใช้ทำอะไรได้บ้าง?


ฉันรู้ว่า hashCode หมายถึงอะไรฉันพยายามเรียกใช้รหัสของฉันหลายครั้งเพื่อรับรหัสและคืนรหัส hashcode เดียวกันสำหรับรายการเดียวกันทุกครั้งและดูเหมือนจะไม่ซ้ำกัน แต่ฉันก็ไม่ค่อยแน่ใจ ก็โอเคถ้าคุณต้องการลงคะแนนมันเป็นความคิดเห็นของคุณ ขอบคุณสำหรับการแก้ไขต่อไป!
Nghia Nguyen

7
ฉันขอแนะนำให้อ่านแนวทางและกฎของ Eric Lippert สำหรับ GetHashCodeแม้ว่าจะเน้นที่กฎสำหรับการใช้ HashCodes มากกว่ากฎสำหรับการใช้งาน ... เนื่องจากพวกเขาคือ " โดยการออกแบบมีประโยชน์สำหรับสิ่งเดียวเท่านั้น: การวางวัตถุในตารางแฮช"
Brian

คำตอบ:


108

MSDN พูดว่า :

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

กระบวนการ GetHashCode วิธีนี้เหมาะสำหรับใช้ในอัลกอริทึมการแฮชและโครงสร้างข้อมูลเช่นตารางแฮช

การใช้งานเริ่มต้นของวิธีการ GetHashCode ไม่รับประกันค่าส่งคืนที่ไม่ซ้ำกันสำหรับวัตถุที่แตกต่างกัน นอกจากนี้. NET Framework ไม่รับประกันการใช้งานเริ่มต้นของวิธี GetHashCode และค่าที่ส่งคืนจะเหมือนกันระหว่าง. NET Framework รุ่นต่างๆ ดังนั้นการใช้งานเริ่มต้นของวิธีนี้จะต้องไม่ถูกใช้เป็นตัวระบุวัตถุที่ไม่ซ้ำกันเพื่อวัตถุประสงค์ในการแฮช

วิธีการ GetHashCode สามารถถูกแทนที่ด้วยชนิดที่ได้รับ ประเภทค่าจะต้องแทนที่วิธีนี้เพื่อให้มีฟังก์ชันแฮชที่เหมาะสมสำหรับประเภทนั้นและเพื่อให้การกระจายที่มีประโยชน์ในตารางแฮช เพื่อความไม่ซ้ำรหัสแฮจะต้องยึดตามค่าของเขตข้อมูลอินสแตนซ์หรือคุณสมบัติแทนของเขตข้อมูลหรือคุณสมบัติแบบคงที่

วัตถุที่ใช้เป็นคีย์ในวัตถุ Hashtable จะต้องแทนที่เมธอด GetHashCode ด้วยเพราะวัตถุเหล่านั้นจะต้องสร้างรหัสแฮชของตนเอง ถ้าวัตถุที่ใช้เป็นคีย์ไม่มีการใช้งานที่มีประโยชน์ของ GetHashCode คุณสามารถระบุผู้ให้บริการรหัสแฮชเมื่อสร้างวัตถุ Hashtable ก่อนหน้า. NET Framework เวอร์ชั่น 2.0 ผู้ให้บริการรหัสแฮชจะยึดตามส่วนต่อประสาน System.Collections.IHashCodeProvider เริ่มต้นด้วยรุ่น 2.0 ผู้ให้บริการรหัสแฮชจะขึ้นอยู่กับส่วนต่อประสาน System.Collections.IEqualityComparer

โดยพื้นฐานแล้วรหัสแฮชมีอยู่เพื่อให้แฮชเทเบิลใช้ได้
สองวัตถุที่เท่ากันนั้นรับประกันว่าจะมีแฮชโคดที่เท่ากัน
วัตถุที่ไม่เท่ากันสองอย่างไม่รับประกันว่าจะมีแฮชโคเดที่ไม่เท่ากัน (เรียกว่าการชน)


3
ใบเสนอราคาจาก MSDN ล้าสมัยแล้ว ขณะนี้ MSDN ไม่ชัดเจนเกี่ยวกับรหัสแฮชที่ไม่ซ้ำกัน
user34660

248

หลังจากเรียนรู้ว่ามันคืออะไรเกี่ยวกับฉันคิดว่าการเขียนคำอธิบายที่ง่ายกว่าหวังผ่านการเปรียบเทียบ:

สรุป: แฮชโค้ดคืออะไร?

  • มันเป็นลายนิ้วมือ เราสามารถใช้ลายนิ้วมือนี้เพื่อระบุคนที่สนใจ

อ่านด้านล่างสำหรับรายละเอียดเพิ่มเติม:

คิด Hashcode เมื่อเราพยายามระบุคนที่ไม่เหมือนใคร

ฉันเป็นนักสืบโดยมองหาอาชญากร ให้เราเรียกเขาว่า Cruel (เขาเป็นฆาตกรที่มีชื่อเสียงเมื่อตอนที่ฉันยังเป็นเด็ก - เขาบุกเข้าไปในบ้านที่ถูกลักพาตัวและฆ่าเด็กผู้หญิงที่น่าสงสารทิ้งร่างของเธอและเขาก็ยังอยู่ในสภาพหลวม - แต่นั่นเป็นเรื่องแยกต่างหาก) Mr Cruel มีลักษณะพิเศษบางอย่างที่ฉันสามารถใช้เพื่อระบุตัวตนของเขาท่ามกลางทะเลของผู้คน เรามี 25 ล้านคนในประเทศออสเตรเลีย หนึ่งในนั้นคือ Mr Cruel เราจะหาเขาเจอได้อย่างไร?

วิธีที่ไม่ดีในการระบุตัวตนของนายโหดร้าย

เห็นได้ชัดว่า Mr Cruel มีดวงตาสีฟ้า นั่นไม่ได้ช่วยอะไรมากนักเพราะเกือบครึ่งหนึ่งของประชากรในออสเตรเลียก็มีดวงตาสีฟ้าเช่นกัน

วิธีที่ดีในการระบุตัวตนของนายโหดร้าย

ฉันสามารถใช้อะไรได้อีก ฉันรู้: ฉันจะใช้ลายนิ้วมือ!

ข้อดี :

  • มันยากจริงๆที่คนสองคนจะมีลายนิ้วมือเหมือนกัน (เป็นไปไม่ได้ แต่ไม่น่าเป็นไปได้มาก)
  • ลายนิ้วมือของ Mr Cruel จะไม่เปลี่ยนแปลง
  • ทุกส่วนของสิ่งมีชีวิตทั้งหมดของ Mr Cruel: รูปร่างหน้าตาสีผมบุคลิกภาพนิสัยการกินและอื่น ๆ จะต้องสะท้อนให้เห็นในลายนิ้วมือของเขาเช่นถ้าเขามีน้องชาย (ซึ่งคล้ายกันมาก แต่ไม่เหมือนกัน) - จากนั้นทั้งสองควรมีลายนิ้วมือที่แตกต่างกัน ฉันพูดว่า "ควร" เพราะเราไม่สามารถรับประกันได้ 100% ว่าคนสองคนในโลกนี้จะมีลายนิ้วมือที่แตกต่างกัน
  • แต่เราสามารถรับประกันได้เสมอว่า Mr Cruel จะมีลายนิ้วมือเหมือนกันเสมอและลายนิ้วมือของเขาจะไม่เปลี่ยนแปลง

ลักษณะข้างต้นโดยทั่วไปทำให้ฟังก์ชั่นแฮชดี

ดังนั้นการจัดการกับ 'การชน' คืออะไร

ลองจินตนาการดูว่าถ้าฉันเป็นผู้นำและฉันพบว่ามีใครบางคนที่เข้ากับลายนิ้วมือของ Mr Cruel หมายความว่าฉันเจอ Mr Cruel แล้วหรือยัง?

........ บางที! ฉันต้องมองให้ใกล้ขึ้น ถ้าฉันใช้ SHA256 (ฟังก์ชั่นคร่ำครวญ) และฉันกำลังมองหาในเมืองเล็ก ๆ ที่มีเพียง 5 คน - แล้วมีโอกาสที่ดีมากที่ฉันได้พบเขา! แต่ถ้าฉันใช้ MD5 (ฟังก์ชั่นแฮชที่มีชื่อเสียงอีกอัน) และตรวจสอบลายนิ้วมือในเมืองที่มีคน +2 ^ 1,000 คนมันเป็นความเป็นไปได้ที่ค่อนข้างดีที่คนสองคนที่แตกต่างกันโดยสิ้นเชิงอาจมีลายนิ้วมือเหมือนกัน

ดังนั้นอะไรคือประโยชน์ของสิ่งนี้อย่างไรก็ตาม

ประโยชน์ที่แท้จริงเพียงอย่างเดียวของแฮชโค้ดคือถ้าคุณต้องการใส่อะไรลงในตารางแฮชและด้วยตารางแฮชที่คุณต้องการค้นหาวัตถุอย่างรวดเร็ว - และนั่นคือสิ่งที่รหัสแฮชเข้ามาพวกเขาอนุญาตให้คุณค้นหาสิ่งต่าง ๆ ในตารางแฮช อย่างรวดเร็ว. มันเป็นแฮ็คที่ช่วยเพิ่มประสิทธิภาพได้อย่างมาก แต่มีค่าใช้จ่ายเล็กน้อยที่แม่นยำ

ลองจินตนาการว่าเรามีโต๊ะแฮชที่เต็มไปด้วยผู้คน 25 ล้านคนในออสเตรเลีย Mr Cruel อยู่ที่ไหนซักแห่งในนั้น ..... เราจะหาเขาเจอได้เร็วแค่ไหน? เราจำเป็นต้องจัดเรียงพวกเขาทั้งหมด: เพื่อค้นหาการแข่งขันที่อาจเกิดขึ้นหรือเพื่อหาผู้ต้องสงสัยที่อาจเกิดขึ้น คุณไม่ต้องการพิจารณาคุณสมบัติที่เป็นเอกลักษณ์ของแต่ละคนเพราะอาจใช้เวลานานเกินไป คุณจะใช้อะไรแทน คุณต้องการใช้รหัสลับ! hashcode สามารถบอกคุณได้ว่าคนสองคนนั้นแตกต่างกันหรือไม่ ไม่ว่า Joe Bloggs ไม่ใช่ Mr Cruel ถ้าภาพพิมพ์ไม่ตรงกันคุณก็รู้ว่าไม่ใช่ Mr Cruel แน่นอน แต่ถ้าพิมพ์ลายนิ้วมือตรงกันจากนั้นขึ้นอยู่กับฟังก์ชั่นแฮชที่คุณใช้โอกาสที่คุณจะพบคนของคุณค่อนข้างดีอยู่แล้ว แต่มันไม่ได้ 100% วิธีเดียวที่คุณมั่นใจได้คือการสอบสวนเพิ่มเติม: (i) เขา / เธอมีโอกาส / แรงจูงใจ (ii) พยาน ฯลฯ เป็นต้น

เมื่อคุณใช้คอมพิวเตอร์หากวัตถุสองชิ้นมีค่ารหัสแฮชเหมือนกันคุณต้องตรวจสอบเพิ่มเติมว่าวัตถุนั้นเท่ากันจริงหรือไม่ เช่นคุณต้องตรวจสอบว่าวัตถุนั้นมีความสูงเท่ากันน้ำหนักเดียวกันหรือไม่ถ้าจำนวนเต็มเท่ากันหรือว่า customer_id เป็นการจับคู่แล้วจึงสรุปว่าเป็นวัตถุเดียวกันหรือไม่ สิ่งนี้มักจะทำโดยการใช้ IComparer หรืออินเทอร์เฟซ IEquality

สรุปคีย์

ดังนั้นโดยทั่วไป hashcode เป็นลายนิ้วมือ

ลายนิ้วมือดิจิตอล - คุณลักษณะรูปภาพเป็น Pixabay - ใช้ได้อย่างอิสระที่: https://pixabay.com/th/finger-fingerprint-security-digital-2081169/

  1. คนสองคน / วัตถุที่แตกต่างกันในทางทฤษฎียังคงมีลายนิ้วมือเหมือนกัน หรือในคำอื่น ๆ หากคุณมีลายนิ้วมือสองอันที่เหมือนกัน ......... ดังนั้นพวกเขาไม่จำเป็นต้องมาจากบุคคล / วัตถุเดียวกัน
  2. Buuuuuut บุคคล / วัตถุเดียวกันจะส่งคืน ลายนิ้วมือเดียวกันเสมอ
  3. ซึ่งหมายความว่าหากวัตถุสองรายการส่งคืนรหัสแฮชที่แตกต่างกันคุณจะทราบได้อย่างแน่นอน 100% ว่าวัตถุเหล่านั้นแตกต่างกัน

ใช้เวลา 3 นาทีในการทำให้หัวของคุณดีขึ้น บางทีอ่านมันสองสามครั้งจนกว่ามันจะสมเหตุสมผล ฉันหวังว่าสิ่งนี้จะช่วยให้ใครบางคนเพราะฉันเสียใจที่ต้องเรียนรู้ทุกอย่าง!


1
Re: เอกสาร MSDN ฆ่าเซลล์สมองของฉันไม่กี่ .... ขับรถของฉันไปที่ขอบของการฆ่าตัวตาย บันทึกไว้เพียงเพราะฉันหลับ;)
Shwrk

คุณทำลายคำอธิบายที่ดีทั้งหมดของคุณด้วยเครื่องหมายดอกจันที่ความคิดเห็นในตอนท้าย
Waldemar Gałęzinowski

ฉันชอบมัน! ส่วนใหญ่ชื่อ "Mr.Cruel!
João Pedro Andrade Marques

ในฐานะที่เป็นแฟนอาชญากรรมตัวจริงนี่อาจเป็นคำตอบที่ฉันชอบมากที่สุด ... เคย
IfElseTryCatch

11

GetHashCode()ใช้เพื่อช่วยสนับสนุนการใช้วัตถุเป็นกุญแจสำคัญสำหรับตารางแฮช (มีสิ่งที่คล้ายกันใน Java ฯลฯ ) เป้าหมายสำหรับทุกวัตถุเพื่อส่งคืนรหัสแฮชที่แตกต่างกัน แต่สิ่งนี้มักจะไม่สามารถรับประกันได้อย่างแน่นอน มันเป็นเรื่องที่ต้องคิดว่าวัตถุทั้งสองเท่ากับเหตุผลกลับเดียวกันรหัสกัญชา

การนำไปใช้ตารางแฮชทั่วไปเริ่มต้นด้วยค่า hashCode ใช้โมดูลัส (ดังนั้นการ จำกัด ค่าภายในช่วง) และใช้มันเป็นดัชนีไปยังอาร์เรย์ของ "ถัง"


8

ไม่ใช่เอกลักษณ์ของ WP7 - มีอยู่ในออบเจ็กต์. Net ทั้งหมด การเรียงลำดับทำในสิ่งที่คุณอธิบาย แต่ฉันจะไม่แนะนำให้ใช้เป็นตัวระบุที่ไม่ซ้ำกันในแอปของคุณเนื่องจากไม่รับประกันว่าจะไม่ซ้ำกัน

วิธีการ Object.GetHashCode


4

นี่คือจากบทความ msdn ที่นี่:

https://blogs.msdn.microsoft.com/tomarcher/2006/05/10/are-hash-codes-unique/

"ในขณะที่คุณจะได้ยินเสียงคนที่รัฐรหัสกัญชาสร้างคุณค่าที่เป็นเอกลักษณ์สำหรับการป้อนข้อมูลที่กำหนดความจริงก็คือว่าในขณะที่เรื่องยากที่จะประสบความสำเร็จมันเป็นไปได้ทางเทคนิคที่จะได้พบกับสองปัจจัยการผลิตข้อมูลที่แตกต่างกันว่ากัญชาเป็นค่าเดียวกัน . แต่ความจริง การพิจารณาปัจจัยที่เกี่ยวข้องกับประสิทธิผลของอัลกอริธึมการแฮชจะอยู่ที่ความยาวของรหัสแฮชที่สร้างขึ้นและความซับซ้อนของข้อมูลที่ถูกแฮช "

ดังนั้นเพียงแค่ใช้อัลกอริทึมแฮชที่เหมาะสมกับขนาดข้อมูลของคุณและมันจะมีแฮชโค้ดที่ไม่เหมือนใคร

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