/ 365วันแห่งโปรแกรม

[365 วันแห่งโปรแกรม #day21] Magic Number

วันที่ยี่สิบเอ็ดของ ‪#‎365วันแห่งโปรแกรม‬ วันนี้เราจะมีคุยกันเรื่อง Magic Number


Magic Number คืออะไร?

ในทางการเขียนโปรแกรมแล้ว คำว่า Magic Number นั้นมีหลายความหมาย แต่โดยทั่วไปแล้วจะหมายถึงหนึ่งใน 3 ข้อนี้

  • ค่าคงที่เป็นตัวเลขหรือตัวอักษรที่ใช้สำหรับแบ่งแยกประเภทของไฟล์ (file signatures) หรือโปรโตคอล

  • ค่าที่ไม่ซ้ำกัน (unique values) และสามารถใช้ในการแยกแยะของต่างๆ ได้ เช่น GUID (Globally Unique Identifiers)

  • ค่าที่ไม่รู้ความหมาย และอาจถูกใช้อยู่บ่อยครั้งในโค้ด ซึ่งสมควรจะเปลี่ยนไปใช้ค่าคงที่แทน

ในบทความนี้เราจะเน้นไปที่ GUID และ file signatures

GUID

GUID คือค่าที่ถูกสร้างขึ้นมาเพื่อระบุตัวตนของอะไรก็ตาม ดังนั้นค่า GUID นี้จะต้องไม่ซ้ำกัน GUID จะมีขนาด 128-bit และถูกแสดงแทนด้วยเลขฐานสิบหก 32 ตัว โดยแบ่งออกเป็นกลุ่มๆ ด้วยเครื่องหมาย hyphen (-) เช่น 21EC2020-3AEA-4069-A2DD-08002B30309D

ในปัจจุบันเรามีการนำ GUID มาใช้กันอย่างแพร่หลาย เช่น ใช้สำหรับแยกแยะ application (แอพสามารถมีชื่อซ้ำกันได้) ใช้สำหรับเป็น id ของ disk partition หรือใช้ทำ session หรือ user token เพื่อยืนยันผู้ใช้ เป็นต้น

File Signatures

ในโลกของไฟล์แล้ว เรามักใช้สกุลของไฟล์ (Filename extension) ในการแยกแยะว่าไฟล์นี้เป็นไฟล์อะไร เปิดด้วยโปรแกรมไหนได้

บน Windows OS ก็ใช้วิธีเดียวกันในการแยกแยะประเภทของไฟล์คืออ่านจากนามสกุลของไฟล์ แต่บนระบบปฏิบัติการที่เป็น *NIX based นั้นไฟล์ไม่จำเป็นต้องมีนามสกุลเพราะตัว OS สามารถแยกแยะไฟล์ได้ด้วยวิธีอื่น หนึ่งในวิธีที่มีประสิทธิภาพก็คือการใช้ Magic Number

ทั่วไปแล้วไฟล์ชนิดเดียวกันย่อมมีโครงสร้างบางส่วนที่เหมือนกัน เรื่องนี้ไม่ใช่เรื่องบังเอิญ แต่คนที่คิด format นั้นวางแผนเอาไว้แล้ว ส่วนใหญ่จะมีการกำหนดว่าไฟล์นี้จะขึ้นต้น n ไบต์แรกด้วยค่าอะไร หรือมี n ไบต์สุดท้ายเป็นค่าอะไร เช่น ในไฟล์ jpg, jpeg จะมี 4 bytes แรกเป็น FF D8 FF E0 (สามารถลองเปิดดูได้ด้วย hex editor) สำหรับโปรแกรมเมอร์แล้วสิ่งนี้จะมีประโยชน์มากในการตรวจสอบไฟล์ที่อัพโหลด หรือตรวจสอบเบื้องต้นก่อนเปิดไฟล์นั้น

jpg file data

สามารถเข้าไปดู list ของ file format ได้ที่ List of file signatures

‪#‎day21 #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...