Menu

Kiểm tra số: ký tự, độ dài và chữ số kiểm tra

Kiểm tra số gồm ba lớp xếp theo thứ tự: tập ký tự, độ dài và chữ số kiểm tra. Bài này nói rõ vì sao thứ tự đó quan trọng, vì sao định dạng đúng chưa chắc là số có thật, và bốn kết luận mà một công cụ kiểm tra cần phân biệt.

Đăng ngày

  • kiểm tra số
  • chữ số kiểm tra
  • dữ liệu thử

Kiểm tra số là việc tách một chuỗi ký tự vừa được dán vào thành ba câu hỏi riêng biệt: chuỗi này có dùng đúng tập ký tự hay không, có đúng độ dài hay không, và chữ số nằm ở cuối có khớp với phần còn lại theo quy tắc đã công bố hay không. Đọc hết bài này, bạn sẽ biết ba lớp đó khác nhau ở đâu, vì sao chúng phải được xét theo đúng thứ tự, và vì sao một chuỗi vượt qua cả ba lớp vẫn chưa chứng minh được điều gì về con số có thật đứng sau nó.

Kiểm tra số là gì và gồm những lớp nào?

Khi bạn dán một dãy số vào một biểu mẫu, hệ thống phía sau phải trả lời được nhiều câu hỏi khác nhau, và mỗi câu hỏi cần một lượng thông tin khác nhau. Câu dễ nhất là câu hỏi về ký tự: chuỗi này chỉ gồm chữ số, hay có lẫn chữ cái và ký tự lạ. Câu thứ hai là câu hỏi về độ dài: chuỗi này dài bao nhiêu ký tự sau khi đã bỏ hết dấu phân cách. Câu thứ ba mới là câu hỏi khó: nếu hệ thống đã công bố một thuật toán chữ số kiểm tra, thì chữ số cuối cùng có đúng là kết quả của thuật toán đó hay không.

Ba câu hỏi này không thay thế nhau. Một chuỗi có thể đúng tập ký tự nhưng sai độ dài; đúng độ dài nhưng sai chữ số kiểm tra; hoặc đúng cả ba mà vẫn không có gì bảo đảm. Đó là lý do một công cụ kiểm tra tử tế phải nói rõ nó đang trả lời câu hỏi nào, thay vì gộp tất cả thành một chữ đạt hoặc không đạt.

Bốn kết luận thay vì hai

Cách trình bày nhị phân, chỉ có đạt và không đạt, che mất sự khác biệt quan trọng nhất của công việc này. Một kết quả kiểm tra nên rơi vào một trong bốn trạng thái sau, và mỗi trạng thái dẫn tới một hành động khác nhau.

Kết luận Nghĩa là gì Người dùng nên làm gì
Hợp lệ Chuỗi đạt thuật toán chữ số kiểm tra mà hệ thống này công bố Không cần sửa, nhưng cũng chưa nên tin là số có thật
Không hợp lệ Định dạng khớp, nhưng chữ số kiểm tra không đúng Gõ lại, rất có thể đã sai một chữ số
Chỉ định dạng Hệ thống không công bố thuật toán chữ số kiểm tra, nên chỉ xác nhận được định dạng Kiểm tra kỹ bằng mắt, phần còn lại phải hỏi nguồn dữ liệu
Không có quy tắc Không có hệ thống nào mà công cụ đang dùng khớp với chuỗi này Đừng kết luận số này là giả, chỉ là chưa có quy tắc để đối chiếu

Dòng thứ ba và dòng thứ tư là hai dòng hay bị bỏ qua nhất. Khi một công cụ không có quy tắc cho một chuỗi, câu trả lời đúng là nói thẳng như vậy, chứ không phải im lặng rồi báo lỗi định dạng. Khi một hệ thống chưa từng công bố thuật toán chữ số kiểm tra, câu trả lời đúng là chỉ định dạng, chứ không phải gán cho nó một chữ hợp lệ mơ hồ.

Vì sao định dạng đúng chưa chắc là số có thật?

Vì chữ số kiểm tra chỉ là một phép kiểm tra tính tự nhất quán bên trong chuỗi. Nó được tính từ chính những chữ số đứng trước nó, theo một quy tắc ai cũng đọc được. Bất kỳ ai hiểu quy tắc cũng có thể ngồi dựng một chuỗi mới hoàn toàn và tính ra chữ số cuối sao cho phép kiểm tra đạt. Chuỗi đó sẽ đạt, và nó sẽ vẫn là một chuỗi chưa từng được cấp cho ai.

Nói cách khác, phép kiểm tra chữ số trả lời câu hỏi chuỗi này có bị gõ nhầm không, chứ không trả lời câu hỏi chuỗi này có tồn tại trong thực tế không. Ba câu hỏi sau đây hoàn toàn nằm ngoài tầm với của bất kỳ thuật toán nào chạy trên một chuỗi ký tự: số này có được một tổ chức nào đó cấp thật hay không, nó đang thuộc về ai, và nó còn dùng được hay không. Cả ba đều cần một cuộc tra cứu ở nguồn dữ liệu, không phải một phép chia lấy dư.

Đây là ranh giới mà mọi tài liệu kỹ thuật nghiêm túc đều vẽ ra, và cũng là ranh giới mà một biểu mẫu dễ vượt qua nhất khi nó biến kết quả tính toán thành một câu khẳng định về con số.

Một số có thể khớp nhiều hệ thống cùng lúc

Các hệ thống đánh số được thiết kế độc lập với nhau, nên việc chúng chồng lên nhau là chuyện bình thường. Một chuỗi có độ dài và tập ký tự hợp với hệ thống của nước này hoàn toàn có thể hợp với hệ thống của nước khác, và nếu cả hai hệ thống đều công bố thuật toán chữ số kiểm tra thì chuỗi đó có thể đạt cả hai phép tính.

Trong tình huống đó, câu trả lời đúng là liệt kê song song mọi hệ thống khớp được, kèm lý do vì sao mỗi hệ thống khớp. Việc tự chọn một quốc gia thay người dùng là một phán đoán không có cơ sở trong dữ liệu, và nó biến một kết quả đúng thành một kết luận sai. Cách xử lý này càng quan trọng khi chuỗi đầu vào ngắn, vì không gian khả năng càng rộng thì càng nhiều hệ thống có thể cùng khớp.

Một hệ quả kỹ thuật đi kèm: mỗi khả năng phải được kiểm tra độc lập, gồm cả chữ số kiểm tra riêng của nó. Nếu hệ thống A có thuật toán còn hệ thống B thì không, kết quả đúng là một dòng hợp lệ hoặc không hợp lệ cho A, và một dòng chỉ định dạng cho B, chứ không phải một dòng duy nhất trung bình cộng hai cách hiểu.

Chuẩn hóa trước khi làm bất cứ điều gì khác

Trước ba lớp lọc ở trên còn một bước không được bỏ: chuẩn hóa. Cùng một số có thể được viết bằng nhiều cách khác nhau trên giấy tờ, trong thư điện tử và trong bảng tính. Dấu cách, dấu gạch nối, dấu chấm và dấu gạch chéo thường chỉ có tác dụng trình bày cho dễ đọc. Chữ cái thì không phân biệt chữ hoa chữ thường trong hầu hết các hệ thống.

Vì vậy bước đầu tiên luôn là bỏ hết dấu phân cách và thống nhất dạng chữ, rồi mới đếm độ dài và đối chiếu tập ký tự. Nếu bạn đếm độ dài trước khi bỏ dấu cách, một số gõ đúng vẫn bị báo sai, và thông báo lỗi sẽ chỉ vào chỗ không có lỗi. Hai điều cần nói rõ để tránh hiểu nhầm: chuẩn hóa không sửa được lỗi gõ thật, và nó cũng không phải một biện pháp an toàn. Nó chỉ bảo đảm hai cách viết của cùng một số cho ra cùng một kết quả.

Nếu bạn muốn thấy toàn bộ chuỗi xử lý này chạy trên một giá trị cụ thể, công cụ kiểm tra số của trang này sẽ hiển thị số đã chuẩn hóa, các phần tách được, và kết luận thuộc một trong bốn trạng thái nói trên.

Phần dành cho nhà phát triển: chia tầng cho đường ống kiểm tra

Điều đáng chốt trước khi viết dòng đầu tiên là ranh giới giữa các tầng. Một trình tự hợp lý thường đi từ việc rẻ nhất và chắc chắn nhất tới việc đắt nhất và ít chắc chắn nhất: chuẩn hóa, kiểm tra tập ký tự, kiểm tra độ dài, nhận diện hệ thống khả dĩ, rồi mới tính chữ số kiểm tra. Đảo thứ tự này sẽ khiến bạn phải xử lý những chuỗi không thể xử lý được, và thông báo lỗi trả về sẽ khó hiểu với người dùng.

Vài điểm khác đáng lưu ý khi lắp đường ống đó vào một hệ thống thật:

  • Giữ việc chuẩn hóa ở một chỗ duy nhất. Nếu mỗi màn hình tự cắt dấu phân cách theo một kiểu, bạn sẽ có hai định nghĩa khác nhau về cùng một số và không ai biết định nghĩa nào đang thắng.
  • Trả về lý do chứ không chỉ trả về kết quả. Một kết luận không kèm hệ thống nào và quy tắc nào thì người dùng không thể sửa, còn lập trình viên thì không thể gỡ lỗi.
  • Tách việc kiểm tra cục bộ khỏi việc tra cứu ở nguồn dữ liệu. Việc thứ nhất nhanh, chạy được khi mất mạng và cho kết quả lặp lại được; việc thứ hai chậm, có thể hỏng và có thể bị giới hạn tần suất.
  • Đừng gộp nhiều lớp vào một hàm duy nhất. Khi tách rời, bạn mới phân biệt được lỗi do người dùng sửa được với lỗi do hệ thống không có quy tắc.
  • Đặt tên cho trạng thái chỉ định dạng ngay từ đầu, và đừng bao giờ ánh xạ nó sang trạng thái hợp lệ chỉ để giao diện gọn hơn.

Một khi bốn trạng thái đã có tên riêng trong mã nguồn, việc viết thông báo lỗi trở nên dễ hơn nhiều, vì bạn chỉ còn dịch từng trạng thái sang một câu tiếng Việt cụ thể.

Bước tiếp theo

Hãy thử lấy một chuỗi số bất kỳ đang có trong bộ dữ liệu thử của bạn, đổi đúng một chữ số ở giữa, rồi xem hệ thống của bạn trả lời thế nào. Nếu nó báo lỗi định dạng thay vì báo chữ số kiểm tra không đúng, đường ống của bạn đang gộp hai lớp khác nhau. Để đi sâu vào lớp thứ ba, bài tổng quan các thuật toán chữ số kiểm tra giải thích cả họ thuật toán và cách chọn; còn bài những số không có chữ số kiểm tra nói về trường hợp ngược lại, khi không có gì để tính. Nếu công việc của bạn thiên về dữ liệu liên hệ, bài kiểm thử địa chỉ và số điện thoại quốc tế có thêm ví dụ về cùng kiểu sai sót.

Mọi chuỗi số xuất hiện trong bài này đều là ví dụ được dựng riêng cho việc giải thích ba lớp kiểm tra; chúng không ứng với bất kỳ số giấy tờ, tài khoản hay ấn phẩm nào có thật, và không được dùng để mạo danh hay để khẳng định một con số là dùng được.

Đọc tiếp

Bài viết về Kiểm Tra CCCD