Git SHA-1 Hash คืออะไร? ทำไม Commit มี ID ยาว 40 ตัวอักษร

Commit ID ในระบบ Git คือ SHA-1 Hash ซึ่งสร้างจากเนื้อหาของ Commit แต่ละครั้ง ฟีเจอร์นี้ให้ Git ที่มีการกระจาย (Distributed) ได้อย่างปลอดภัย โดยรับประกันว่าทุก Commit มีตัวอักษรเฉพาะตัว

SHA-1 Hash คืออะไร

SHA-1 (Secure Hash Algorithm 1) คือฟังก์ชันแฮชที่ใช้ในการสร้าง Commit ID ในระบบ Git โดยมีลักษณะดังนี้:

  • ใช้วิธี Content-based Addressing ในการระบุตำแหน่ง Commit
  • สร้างค่าแฮชที่มีความยาว 40 ตัวอักษร (Hexadecimal)
  • ตรวจสอบว่า Commit ไม่ได้รับการเปลี่ยนแปลง (Integrity)
  • ยืนยันตัวตนและความถูกต้องของ Repository

ตัวอย่างรูปแบบ SHA-1 Hash:

abc123d456ef7890ab12c3d456ef7890ab12c3d

ทำไม Git Commit มี ID ยาว 40 ตัวอักษร

SHA-1 Algorithm ส่งออกค่าแฮชในรูปแบบเลขฐาน 16 (Hexadecimal) ที่มี 160 บิต (bits) ในการคำนวณแล้ว เมื่อแปลงเป็นเลขฐาน 16 จะได้ความยาวกำหนดดังนี้:

  • 160 บิต ÷ 4 บิต (ต่อตัวอักษร Hexadecimal) = 40 ตัวอักษร
  • แต่ละตัวอักษรแทนค่า 0-9 และ a-f (16 ค่าที่เป็นไปได้)
  • จำนวนรวม Commit ที่เป็นไปได้: 2^160 (ประมาณ 1.46 × 10^48)

Commit ID ถูกสร้างจากข้อมูลอะไร

SHA-1 Hash สร้างขึ้นจากรวมหลายประเภทข้อมูล ทำให้แต่ละ Commit มี ID ที่ไม่ซ้ำกัน:

SHA-1(input) ที่มาจากข้อมูลต่อไปนี้:
• Parent Commit Hash
• Tree (Structure ของไฟล์)
• Author Name และ Email
• Commit Message
• Timestamp (วันและเวลา Commit)

ถ้าเปลี่ยนแปลงข้อมูลใดข้อมูลหนึ่ง Hash ก็จะเปลี่ยนไปโดยสิ้นเชิง นี่คือความปลอดภัยหลักของ Git

ดูตัวอย่าง Commit ID ในจริง

# ดู Full SHA-1 Hash (40 ตัวอักษร)
git log --no-decorate
# Output:
# abc123d456ef7890ab12c3d456ef7890ab12c3d

# ดู Short SHA-1 Hash (7 ตัวอักษรแรก)
git log --oneline
# Output: abc123d Add new feature X

# ดู Commit Details
git show abc123d

# กำหนดความยาว Short Hash (Default 7)
git log --abbrev=12
# Output: abc123d456ef Add new feature X

ทำไม Git ใช้ Content-based Addressing

วิธีนี้เสนอประโยชน์มากมายสำหรับ Version Control:

  • Data Integrity: ตรวจสอบว่าข้อมูล Repository ไม่เสียหายหรือถูกแก้ไข
  • Distributed Safety: ทำให้ Git นิรภัยในการทำงานแบบ Decentralized
  • Conflict Detection: ตรวจจับ Merge Conflicts ได้ง่ายและแม่นยำ
  • Authenticity: ยืนยันว่า Commit มาจากแหล่งที่ถูกต้อง
  • Deduplication: ไม่เก็บ Commit ที่เหมือนกันหลายครั้ง

Short Hash vs Full Hash

Git อนุญาตให้ใช้ Short Hash ได้ แต่ยังคงความปลอดภัยและเสถียรภาพ:

# Full Hash - ใช้ 40 ตัวอักษรทั้งหมด
abc123d456ef7890ab12c3d456ef7890ab12c3d

# Short Hash - ใช้ 7 ตัวอักษร (Default)
abc123d

# Custom Short Hash - ใช้ความยาวตามที่ต้องการ
git log --abbrev=10  # ใช้ 10 ตัวอักษร
git log --abbrev=15  # ใช้ 15 ตัวอักษร

# Git จะขยายอัตโนมัติถ้า Short Hash ไม่เฉพาะเจาะจง
git log --abbrev=5   # อาจขยายไปกว่า 5 ตัวอักษร

SHA-256 Migration – อนาคตของ Git

Git กำลังเคลื่อนไปสู่ SHA-256 เนื่องจากความเสี่ยงของ SHA-1:

  • Git 2.29+: เริ่มสนับสนุน SHA-256 Algorithm
  • ความยาว: 64 ตัวอักษร (แทนที่ 40 ตัวอักษร)
  • ความปลอดภัย: ยิ่งปลอดภัยกว่า SHA-1 ด้วยพลังการคำนวณที่สูงขึ้น
  • Backward Compatibility: Git ยังรองรับ SHA-1 ในขณะนี้

ความเสี่ยง: SHA-1 Collision

ในปี 2017 ผู้วิจัยค้นพบวิธีสร้าง Collision สำหรับ SHA-1 แต่ Github และ Git ecosystem ปฏิบัติเพื่อลดความเสี่ยง:

# ตรวจสอบค่า Hash ของ Commit
git cat-file -p abc123d456ef7890ab12c3d456ef7890ab12c3d

# ตรวจสอบ Signature ของ Commit
git log --show-signature

# ลงนามใน Commit ด้วย GPG Key
git commit -S -m "Signed commit message"

วิธีป้องกัน SHA-1 Collision:

  • GitHub ปฏิเสธ Push ของ SHA-1 Collision Objects
  • ใช้ Signed Commits เพื่อยืนยันตัวตน
  • ติดตาม Git 2.29+ และ SHA-256 Transition Plan
  • ตรวจสอบและอัปเดต Git ให้เป็นรุ่นล่าสุด
  • ตรวจสอบความถูกต้องของ Deployment โดยการยืนยัน Commit Hash
  • ติดตาม Rollback โดยการอ้างอิง Full Hash หรือ Short Hash
  • ยืนยันว่า Server ของคุณกำลังรัน Commit ที่ถูกต้องเสมอ
  • ใช้ Signed Commits สำหรับ Production Environment

สรุป: SHA-1 Hash ที่มีความยาว 40 ตัวอักษรให้ Git ความสามารถในการยืนยัน Integrity และ Authenticity ของ Repository อย่างแข็งแกร่ง ทำให้นักพัฒนาสามารถทำงานบน Distributed System ได้อย่างปลอดภัยและมั่นใจ