Menu

Chữ số kiểm tra EAN UPC trong mã vạch

Chữ số kiểm tra EAN UPC được tính bằng trọng số xen kẽ và một phép bù của mô-đun, với điểm bắt đầu của trọng số phụ thuộc vào độ dài chuỗi. Bài này giải thích vì sao và nêu giới hạn của phép kiểm tra.

Đăng ngày

  • chữ số kiểm tra EAN UPC
  • mã vạch
  • dữ liệu thử

Chữ số kiểm tra EAN UPC là chữ số cuối cùng trong một mã vạch bán lẻ, và nó được tính theo nhánh thuật toán dùng trọng số xen kẽ, tức là trọng số thay đổi đều đặn giữa hai giá trị khi đi từ trái sang phải. Điểm đáng chú ý của nhánh này là kết quả cuối cùng thường được lấy theo phép bù của mô-đun chứ không phải lấy theo phần dư, và điểm bắt đầu của dãy trọng số lại phụ thuộc vào độ dài chuỗi. Đọc hết bài này, bạn sẽ biết vì sao có hai chi tiết đó, và vì sao quét được một mã vạch không nói được gì về việc món hàng có tồn tại hay không.

Chữ số kiểm tra trong mã vạch nằm ở đâu?

Trong một mã vạch bán lẻ tiêu chuẩn, chữ số kiểm tra nằm ở vị trí cuối cùng của dãy số in dưới các vạch. Phần đứng trước nó mang thông tin về hệ thống đánh số và về đơn vị phát hành mã, tùy theo chuẩn cụ thể. Chữ số cuối không mang thông tin về hàng hóa; nó chỉ tồn tại để phép kiểm tra ở máy quét có thể chạy được trong thời gian rất ngắn.

Vị trí đó có ý nghĩa thực tế. Vì chữ số kiểm tra nằm ở cuối, thuật toán có thể chạy từ trái sang phải trong một lượt mà không cần biết độ dài trước, miễn là biết mình đang đọc chuỗi dài hay ngắn. Đây là một lợi thế khi phần cứng phải xử lý hàng nghìn lượt quét mỗi giờ.

Bất kỳ hệ thống nào nhận mã vạch từ người dùng cũng nên chạy phép kiểm tra này trước khi hỏi cơ sở dữ liệu. Nếu để phép tra cứu chạy trước, bạn sẽ tốn một lượt tra cứu cho mỗi lần gõ nhầm, và trong nhiều hệ thống, các lượt tra cứu đó còn bị tính vào hạn mức.

Trọng số xen kẽ và phép bù của mô-đun

Nhánh thuật toán này nhân từng chữ số với một trọng số, cộng tất cả lại, rồi so với mô-đun. Điểm khác biệt so với các nhánh khác nằm ở hai chỗ. Thứ nhất, trọng số không cố định mà xen kẽ giữa hai giá trị, thường là một và ba, nên hai vị trí cạnh nhau luôn có trọng số khác nhau. Thứ hai, chữ số kiểm tra thường là phần bù cần thêm vào để tổng chia hết cho mười, chứ không phải chính phần dư.

Hệ quả của phép bù là một trường hợp biên rất dễ sai khi tự triển khai. Khi tổng vốn đã chia hết cho mười, phần dư bằng không, và chữ số kiểm tra theo phép bù cũng bằng không. Nếu bạn viết công thức lấy mười trừ phần dư mà không xử lý trường hợp này, bạn sẽ nhận được mười, một giá trị không phải một chữ số. Đây là lỗi phổ biến nhất trong các bản triển khai tự viết cho nhánh thuật toán này.

Vì trọng số xen kẽ khác nhau ở từng vị trí, phép kiểm tra bắt được lỗi đổi chỗ hai chữ số đứng cạnh nhau. Nếu hai vị trí có cùng trọng số, việc đổi chỗ chúng không làm thay đổi tổng, và lỗi sẽ lọt qua. Lý do trọng số được chọn xen kẽ chính là để giảm khả năng đó xuống mức thấp nhất có thể.

Vì sao điểm bắt đầu của trọng số phụ thuộc độ dài?

Vì cùng một dãy vạch có thể được đọc ở hai độ dài khác nhau, và để cả hai cách đọc cho ra cùng một chữ số kiểm tra, người ta phải đặt quy ước về việc bắt đầu nhân từ phía nào. Với chuỗi dài, dãy trọng số bắt đầu từ một phía; với chuỗi ngắn hơn, nó bắt đầu từ phía đối diện.

Đây là chi tiết khiến nhiều bản triển khai chạy đúng với loại mã dài nhưng sai với loại mã ngắn, hoặc ngược lại. Triệu chứng rất dễ nhận ra: một nửa bộ dữ liệu thử đạt, nửa còn lại không đạt một cách vô lý, dù cả hai nửa đều được cấp từ cùng một nguồn. Cách sửa đúng là xác định độ dài trước, rồi chọn hướng bắt đầu trọng số tương ứng, chứ không phải thử cả hai hướng cho mọi trường hợp.

Việc chọn dựa trên độ dài cũng có nghĩa là bước kiểm tra độ dài phải chạy trước bước tính chữ số kiểm tra. Nếu bạn tính trước rồi mới kiểm tra độ dài, bạn sẽ phải tính hai lần với hai hướng khác nhau, và kết quả trả về sẽ khó giải thích khi cả hai hướng đều cho kết quả không đạt.

EAN-13 và UPC-A: hai tên chuẩn khác nhau

EAN-13 và UPC-A là hai tên chuẩn được dùng phổ biến cho mã vạch bán lẻ, và chúng khác nhau chủ yếu ở độ dài chuỗi. Vì độ dài khác nhau, hướng bắt đầu của dãy trọng số cũng khác nhau, đúng như mục trước đã nói. Ngoài ra phần thân của hai chuẩn cũng được chia theo cách khác nhau giữa phần chỉ hệ thống đánh số và phần chỉ đơn vị phát hành.

Đặc điểm EAN-13 UPC-A
Vị trí chữ số kiểm tra Cuối chuỗi Cuối chuỗi
Kiểu trọng số Xen kẽ, hai giá trị Xen kẽ, hai giá trị
Hướng bắt đầu của trọng số Theo quy ước của chuẩn dài Theo quy ước của chuẩn ngắn
Phép so với mô-đun Lấy phần bù Lấy phần bù
Có cần biết độ dài trước Có Có

Bảng này mô tả cấu trúc kiểm tra, không mô tả cách một tổ chức cấp mã. Việc cấp mã thuộc về các tổ chức phát hành, và một hệ thống chỉ tính chữ số kiểm tra không thể biết được mã nào đã được cấp thật.

Quét được mã có nghĩa hàng đó tồn tại?

Không. Phép kiểm tra chỉ xác nhận rằng chuỗi số in dưới các vạch tự nhất quán với chính nó. Nó không tra cứu bất kỳ danh mục hàng hóa nào, không biết mã đó đã được cấp cho sản phẩm nào, và không biết sản phẩm đó còn được bán hay đã ngừng. Ba câu hỏi này cần một cuộc tra cứu ở cơ sở dữ liệu của bên phát hành, và mỗi cuộc tra cứu như vậy có độ trễ, có thể thất bại, và có thể bị giới hạn tần suất.

Cũng cần phân biệt hai tình huống thường bị gộp: chữ số kiểm tra sai, và mã không tồn tại trong danh mục. Tình huống thứ nhất là lỗi gõ, sửa được ngay tại chỗ. Tình huống thứ hai là một câu trả lời hợp lệ của phép tra cứu, và nó không có nghĩa mã đó sai về mặt cấu trúc. Khi hệ thống gộp hai tình huống thành một thông báo, người dùng sẽ đi sửa một con số vốn không có lỗi.

Bạn có thể xem cách tách hai tầng này trên công cụ kiểm tra số của trang này, nơi kết quả tính toán và kết quả nhận diện hệ thống được hiển thị riêng.

Phần dành cho nhà phát triển: kiểm tra ở tầng nhập liệu

Với mã vạch, chi phí của một lần gõ nhầm không chỉ là một thông báo lỗi. Nó còn là một lượt tra cứu bị tiêu tốn, và trong hệ thống có hạn mức thì đó là chi phí thật. Vì vậy phép kiểm tra này nên chạy càng sớm càng tốt, ngay tại tầng nhập liệu.

  • Chạy phép kiểm tra trước khi gọi bất kỳ dịch vụ bên ngoài nào. Không có lý do gì để gửi một chuỗi sai định dạng ra khỏi hệ thống của bạn.
  • Xác định độ dài trước, rồi mới chọn hướng bắt đầu của trọng số. Đừng thử cả hai hướng cho mọi trường hợp, vì như vậy bạn sẽ che mất lỗi độ dài.
  • Xử lý rõ trường hợp phần dư bằng không. Đây là lỗi phổ biến nhất của nhánh thuật toán này, và nó chỉ lộ ra với một số ít giá trị đầu vào.
  • Giữ nguyên chuỗi gốc bên cạnh chuỗi đã chuẩn hóa. Khi đối chiếu với bao bì, bạn cần thấy đúng những gì đã được quét.
  • Ghi lại mã thiết bị quét hoặc nguồn nhập. Khi cùng một mã bị báo sai nhiều lần, thông tin đó cho biết vấn đề nằm ở máy hay ở dữ liệu.
  • Đừng dùng kết quả kiểm tra để quyết định giá hay thuộc tính sản phẩm. Phép kiểm tra này không mang thông tin về hàng hóa, chỉ mang thông tin về tính nhất quán của chuỗi.

Nếu tầng nhập liệu của bạn trả về được lý do cụ thể, số lượt tra cứu không cần thiết sẽ giảm xuống rõ rệt.

Bước tiếp theo

Hãy thử lấy một chuỗi thử ở mỗi chuẩn, cố tình đổi chỗ hai chữ số đứng cạnh nhau, và xem hệ thống của bạn có phát hiện ra không. Nếu không phát hiện, rất có thể dãy trọng số của bạn đang bắt đầu sai hướng ở một trong hai độ dài. Để so sánh nhánh thuật toán này với hai nhánh còn lại, bài thuật toán chữ số kiểm tra: mod-10, mod-11 và mod-97 đặt chúng cạnh nhau; còn bài chữ số kiểm tra ISBN ISSN của sách và ấn phẩm cho thấy cùng một ý tưởng trọng số được dùng trong một lĩnh vực khác. Nếu bạn đang xử lý dữ liệu liên hệ và địa chỉ, bài kiểm thử địa chỉ và số điện thoại quốc tế có thêm ví dụ cùng kiểu.

Mọi dãy số nhắc tới trong bài chỉ là minh họa cho ý tưởng trọng số xen kẽ; chúng không phải mã hàng hóa có thật, không gắn với bất kỳ sản phẩm hay nhà phát hành nào, và không được dùng để mạo danh hay để khẳng định một mã là dùng được.

Đọc tiếp

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