ทำไมถึงเรียกว่า“ ตารางแฮช” หรือ“ ฟังก์ชันแฮช”? แฮชไม่สมเหตุสมผลสำหรับฉันที่นี่ [ปิด]


26

ตอนนี้เป็นเวลาประมาณ 4 ปีของการพัฒนาที่ฉันใช้การได้ยินการพูดคุยและการใช้ตารางแฮชและฟังก์ชันแฮช แต่ฉันไม่เคยเข้าใจเลยว่าทำไมมันถึงเรียกว่าแฮช?

ฉันจำได้ว่าวันแรกที่ฉันเริ่มเขียนโปรแกรมคำศัพท์นี้ช่างยุ่งยากสำหรับฉัน ฉันไม่เคยคิดออกว่ามันคืออะไรตามชื่อของมัน ฉันเพียงแค่การทดลองที่เข้าใจสิ่งที่มันไม่และทำไมและเมื่อเราควรจะใช้มัน

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

ตามพจนานุกรมของฉันแฮชหมายถึง:

  1. ผัดมันฝรั่งและเนื้อสัตว์ (ไม่เกี่ยวข้องสูง)
  2. # symbol (เครื่องหมายหมายเลข AKA, เครื่องหมายปอนด์ ฯลฯ ) (ยังไม่เกี่ยวข้องอาจเป็นเพียงการตั้งชื่อผิด)
  3. ใช้อัลกอริทึมกับสตริงอักขระ (ยังไม่มีส่วนเกี่ยวข้องกับเอกลักษณ์ซึ่งเป็นคุณลักษณะที่สำคัญที่สุดของตารางแฮช)
  4. ตัดอาหาร
  5. อีกคำสำหรับกัญชา

ไม่มีใครรู้ว่าทำไมมันเรียกว่าแฮช


32
คุณดูเหมือนจะเข้าใจผิดเล็กน้อยว่าแฮชคืออะไร ความเป็นเอกลักษณ์ไม่ได้เป็นคุณสมบัติของฟังก์ชั่นแฮชอย่างชัดเจน (เช่นไม่มีการแทรก)
Peter Taylor

1
@ Peter Taylor: ตารางแฮชกำหนดการกำหนดการแมปแบบหัวฉีด
reinierpost

2
@ ปีเตอร์เทย์เลอร์: เป็นคนที่มีไนติงกี้นิดหน่อยพวกเขาไม่จำเป็นต้องฉีดยาแต่บางครั้งพวกเขาก็มีความรู้สึกทางชีวภาพ คิดว่าการดำเนินงานโดยทั่วไปของฟังก์ชั่นคร่ำเครียดสำหรับจำนวนเต็ม :)
keppla

4
แฮชสามารถเป็นเอกลักษณ์ได้ตราบใดที่พื้นที่คีย์ไม่ใหญ่กว่าพื้นที่แฮชของค่า (สำหรับแฮชของตาราง) หรือพื้นที่ของค่าแฮชนั้นมีขนาดใหญ่ที่การชนกันนั้นเป็นไปไม่ได้ทางคณิตศาสตร์
รักษาความปลอดภัย

1
นอกจากนี้ "คีย์ตาราง" จะฟังดูคล้ายกับโครงสร้างข้อมูล "คีย์ / ค่า" ใด ๆ (เรียกอีกอย่างว่า "พจนานุกรม") คีย์ / ค่าโครงสร้างข้อมูลทั้งหมดไม่ใช่ตารางแฮช
barjak

คำตอบ:


46

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

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


2
ไม่แน่ใจว่ามี 'โดเมนย่อย' กำลังทำอะไรอยู่ เป็นเพียงแค่ฟังก์ชันแฮชอย่างละเอียด 'ผสม' ค่าของโดเมน
reinierpost

15

ในฝรั่งเศสตารางแฮชเรียกว่า "table de hachage" คำกริยาที่เกี่ยวข้อง "hacher" หมายถึงการสับ / สับ (อาหารส่วนใหญ่) คำกริยาto hashมีความหมายเหมือนกันในภาษาอังกฤษ

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


2
จริงๆแล้วมันเขียนว่า "hachage" และ "hacher" โดยไม่มีการเน้นเสียง
Ptival

10

หมายเลข 3 มีทุกสิ่งที่ต้องทำ จากวิกิพีเดีย :

หัวใจสำคัญของอัลกอริธึมตารางแฮชคือชุดรายการที่เรียบง่าย นี้มักจะเป็นเพียงแค่เรียกว่าตารางแฮช อัลกอริทึมตารางแฮชคำนวณดัชนีจากคีย์รายการข้อมูลและใช้ดัชนีนี้เพื่อวางข้อมูลลงในอาร์เรย์ การดำเนินงานของการคำนวณนี้เป็นฟังก์ชันแฮช ,f :

index = f(key, arrayLength)

ฟังก์ชั่นกัญชาคำนวณภายในอาร์เรย์จากข้อมูลindex คือขนาดของอาเรย์ สำหรับภาษาแอสเซมบลีหรือโปรแกรมระดับต่ำอื่น ๆฟังก์ชันแฮชเล็กน้อยสามารถสร้างดัชนีได้ด้วยอินไลน์หนึ่งหรือสองตัวkeyarrayLengthคำแนะนำการใช้เครื่อง

ดังนั้นตารางแฮชไม่ได้เก็บค่าตามคีย์ มันเก็บค่าตามรุ่นแฮชของคีย์นั้น


1
ขึ้นอยู่กับสิ่งที่คุณหมายถึงโดยตารางแฮช โครงสร้างข้อมูลตามที่เสนอในภาษาเช่น Perl, Java และ C # จะให้การจับคู่แบบคีย์ - ทู - ค่าโดยใช้ตารางแฮชที่คุณอ้างอิงถึงภายใน
reinierpost

10

ตารางแฮชถูกเรียกอย่างนั้นเพราะใช้รหัสแฮชและเกี่ยวข้องกับ "อาหารตัด"

ลองคิดแบบนี้ - คุณนำวัตถุสวย ๆ ของคุณออกมาเป็นผลไม้แล้วสับมันเพื่อให้มันเริ่มมองเหมือนอย่างอื่น - แค่ตัวเลข - ไม่มีโครงสร้างในนั้นอีกแล้ว ชิ้นส่วนของ "อาหารตัด" นั้นถูกใช้ในตารางแฮชเพื่อค้นหาวัตถุที่สวยงามของคุณ

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

3

การบีบแตร (ในการตัดเป็นชิ้นเล็ก ๆ , การหั่นย่อย ฯลฯ ) ใช้อินพุต (อาหารหรือบางครั้ง supervillains) และแปลงมันเป็นเอาท์พุทที่เป็นเนื้อเดียวกัน คือไม่ว่าคุณจะมีอะไรในตอนแรกในท้ายที่สุดคุณก็แค่แฮช และแฮชหนึ่งช้อนเต็มมีประโยชน์พอ ๆ กับแฮชทั้งหมดในการพิจารณาว่าอินพุตนั้นคืออะไร (สมมติว่าเครื่องแฮชของคุณแฮชได้ดี)
ดังนั้นการแฮชสามารถลดสิ่งที่กินได้หรือสิ่งชั่วร้ายลงในแฮชหนึ่งช้อนเต็มโดยที่วัตถุสองชนิดที่แตกต่างกันจะให้ค่าแฮชที่ต่างกัน ซึ่งหมายความว่าหากสอง supervillains ตกลงไปในเครื่อง hashing ของคุณก็พอเพียงเปรียบเทียบ hash ของพวกเขาเพื่อตรวจสอบว่าหนึ่งเป็นโคลนของอีก

ในทางที่ฟังก์ชั่นการคร่ำครวญในวิทยาการคอมพิวเตอร์นั้นค่อนข้างเหมือนกัน พวกเขารับอินพุตทั้งหมดที่มีขนาดและความหมายแตกต่างกันและ - ใส่ง่าย - พวกเขาเพียงแค่ตัดมันเป็นชิ้น ๆ และผสมสิ่งเหล่านั้นรอบ ๆ และตัดลำดับผลลัพธ์กลับเป็นชิ้น ๆ ในท้ายที่สุดคุณมีข้อมูลป้อนเข้าที่คุณแฮช (n ไบต์) หนึ่งช้อน


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