เมนู

โครงสร้าง IBAN และการตรวจสอบ mod-97

โครงสร้าง IBAN แบ่งเป็นรหัสประเทศ หลักตรวจสอบสากล และ BBAN ที่แต่ละประเทศกำหนดเอง บทความนี้อธิบายแนวคิดการตรวจสอบ mod-97 และเหตุผลที่ผ่านการตรวจแล้วยังไม่แปลว่าบัญชีมีอยู่จริง

เผยแพร่เมื่อ

  • IBAN
  • การตรวจสอบ
  • ข้อมูลทดสอบ

โครงสร้าง IBAN เป็นตัวอย่างที่ดีของหมายเลขที่ผสมสองระดับไว้ในสตริงเดียว คือระดับสากลที่กำหนดเหมือนกันทุกประเทศ กับระดับประเทศที่แต่ละแห่งกำหนดรายละเอียดเอง การทำความเข้าใจสองระดับนี้ทำให้เห็นชัดว่าทำไมระบบที่ใช้รูปแบบความยาวตายตัวเพียงชุดเดียวจึงมักตัดสินผิด ในบทความนี้คุณจะได้เห็นว่าส่วนใดของหมายเลขถูกกำหนดโดยมาตรฐานกลาง ส่วนใดเป็นเรื่องของแต่ละประเทศ และแนวคิดการตรวจสอบที่ใช้กับเลขชุดนี้ทำงานอย่างไร

โครงสร้าง IBAN แบ่งออกเป็นกี่ส่วน?

เมื่อมองจากซ้ายไปขวา หมายเลขประเภทนี้แบ่งได้เป็นสามส่วนเรียงกัน ส่วนแรกคือรหัสประเทศซึ่งเป็นตัวอักษรสองตัวแทนประเทศหรือเขตพื้นที่ที่ออกหมายเลขนั้น ส่วนที่สองคือหลักตรวจสอบสองหลักตามมาตรฐานสากล ซึ่งคำนวณจากตัวเลขทั้งหมดที่เหลือ ส่วนที่สามคือหมายเลขบัญชีพื้นฐานที่แต่ละประเทศกำหนดรูปแบบเอง

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

ส่วนของหมายเลข ผู้กำหนด สิ่งที่ตรวจได้จากส่วนนี้
รหัสประเทศ มาตรฐานกลาง บอกว่าหมายเลขนี้ต้องใช้กฎของประเทศใด
หลักตรวจสอบสากล มาตรฐานกลาง ตรวจความสอดคล้องของสตริงทั้งชุด
หมายเลขบัญชีพื้นฐาน แต่ละประเทศ ต้องอาศัยกฎภายในของประเทศนั้นจึงตรวจต่อได้

รหัสประเทศกับหลักตรวจสอบ ISO สองหลัก

สองส่วนแรกเป็นส่วนที่มาตรฐานกลางดูแล รหัสประเทศบอกว่าหมายเลขนี้อยู่ในความรับผิดชอบของประเทศใด ซึ่งมีผลต่อการตีความส่วนที่เหลือทั้งหมด เพราะเมื่อรู้ประเทศแล้วจึงจะรู้ได้ว่าควรนำหมายเลขไปเทียบกับกฎชุดใดต่อ

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

ทำไม BBAN จึงมีหลักตรวจสอบภายในประเทศซ้อนอยู่

ในหลายประเทศ ส่วนที่สามของหมายเลขยังมีหลักตรวจสอบของตนเองซ้อนอยู่ภายในอีกชั้น หลักตัวนี้ถูกกำหนดโดยประเทศนั้น และคำนวณจากข้อมูลภายในบัญชีเท่านั้น มันจึงตอบคำถามคนละข้อกับหลักตรวจสอบตามมาตรฐานสากล

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

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

แนวคิดของ mod-97: แปลงตัวอักษรเป็นตัวเลขก่อนหาร

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

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

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

ผ่านการตรวจแล้วทำไมยังไม่แปลว่าบัญชีมีอยู่?

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

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

ในทางปฏิบัติ ระบบที่ดีจะแยกสองขั้นตอนนี้ออกจากกันให้ชัด ทั้งในแง่ของข้อความที่แสดงต่อผู้ใช้และในแง่ของตรรกะการตัดสินใจ เพราะการนำผลการคำนวณไปใช้แทนผลการสอบถามจะสร้างข้อสรุปที่ผิดทั้งในทิศทางที่เข้มงวดเกินไปและผ่อนปรนเกินไป

สำหรับนักพัฒนา: ความยาวไม่เท่ากันทำให้ต้องแยกตามประเทศ

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

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

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

ก้าวต่อไป

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

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

อ่านต่อ

บทความเกี่ยวกับ ตรวจสอบเลขบัตรประชาชน