超市條碼最後一碼常被忽略,但它不是裝飾。對常見的商品條碼(如 EAN-13、UPC-A),末碼是檢查碼:用前面各位數字依規則加權加總後取模,算出一個應有值。掃描器讀到的數字若算不出相同檢查碼,就可判斷可能讀錯,要求重掃。它能抓許多單一位錯誤與部分易位錯誤,但不是加密,也不能保證商品「正版」。

為什麼需要檢查碼

光學掃描會受污損、反光、角度與印刷品質影響。若沒有冗餘檢查,讀錯一個數字就可能變成另一種商品代碼,造成錯價或錯帳。檢查碼提供快速、本地端就能做的一致性驗證:不必先問伺服器「這組數字存不存在」,先問「這組數字自身合不合理」。

這屬於錯誤偵測,不是錯誤更正。發現不對就重讀;通常不會在條碼本身自動「修回」正確數字(那是更進階編碼如某些 QR 容錯等級在做的事)。

EAN-13 檢查碼的直觀算法

以 13 碼為例:前 12 碼是資料,第 13 碼是檢查碼。計算時由右至左(或依標準定義的位置)對數字交替乘上 1 與 3,加總後找出能使總和成為 10 的倍數的那個檢查位。實際教學常寫成:

  1. 把前 12 位依位置加權相加
  2. 取總和除以 10 的餘數
  3. 用 10 減去餘數(若餘數為 0 則檢查碼為 0)得到檢查碼

你不必背誦每一個商業變體,只要抓住精神:用模算術把資料映射到一個校驗位。UPC-A 也有類似思想,細節權重與長度不同。

它能抓什麼、抓不到什麼

加權模 10 對「單一數字被改錯」很敏感,對某些相鄰數字對調也有一定偵測力。但若錯誤剛好讓加權和仍然滿足條件,就可能漏網。也就是說,檢查碼大幅降低意外誤讀,不是數學上的絕對證明。

更重要的是:任何人都能依公開規則算出檢查碼。因此它不能當防偽簽名。仿冒者若知道編碼規則,一樣可以印出「自洽」的條碼數字;防偽要靠供應鏈、加密標籤、查詢系統或其他機制。

單一位數錯誤為何容易被發現

假設某一位從 2 誤讀成 7,數值差是 5。這個位置乘上 1 或 3 後,加權總和會改變 5 或 15,兩者都不是 10 的倍數,原本可整除的結果就會留下餘數。掃描器不必知道哪一條黑線受損,只要知道整組資料沒有通過一致性條件。

相鄰兩位互換時,兩個數字交換了權重,總和通常也會改變。不過當兩數之差恰好符合特定條件,變化可能正好是 10 的倍數,錯誤便不會被發現。多個位置同時出錯時,也可能一增一減而互相抵銷。

為何不把每一位直接相加

若所有位置權重相同,12341324 的總和都是 10,交換次序完全不影響驗證。交替使用 1 和 3,可讓位置也參與運算,同時保持規則簡單,適合收銀機與掃描設備大量快速處理。

這是一種工程取捨。更複雜的編碼能攔截更多錯誤,卻需要更多資料空間與運算。零售條碼的目標不是在惡意攻擊下保護祕密,而是用極低成本擋住日常最常見的污損、誤讀和輸入失誤。

和 ISBN、信用卡號的親戚關係

書籍 ISBN、信用卡號等也常見檢查碼(例如 Luhn 算法)。共同點是用公開、可快速計算的冗餘位,過濾輸入與傳輸錯誤。差異在權重、模數與應用場景。理解商品條碼後,你會更容易看懂其他「最後一碼很重要」的編號系統。

與 QR Code 錯誤更正的差別

一般商品條碼的末碼主要回答「讀到的數字是否合理」,驗證失敗後通常只能重掃。QR Code 則加入較多冗餘資料,在圖案部分受損時仍可能重建原始內容。前者屬於錯誤偵測,後者還具備一定程度的錯誤更正

能力更強並非沒有代價。錯誤更正需要占用額外編碼空間,資料量、圖案大小與容錯程度之間必須平衡。EAN/UPC 的檢查碼只有一位,功能有限,但對結帳情境已能迅速排除大量不可靠輸入。

驗證失敗時不能直接猜答案

條碼破損時,系統可以指出末碼不符,卻通常無法唯一判定哪一位錯了。同一組錯誤資料可能有多種修改方式能重新通過檢查。若程式擅自挑一個最接近的合法號碼,反而可能連到另一項真實商品。

較安全的流程是重新掃描、清潔標籤、改變角度,或由人員對照完整印刷數字後輸入。檢查碼的職責是拒絕可疑資料,不是替缺乏證據的資料做自動推測。

通過檢查不等於商品存在

檢查碼只檢驗數字之間的關係。隨意選定前十二碼,再依公開算法補上末碼,也能得到形式正確的 EAN-13,但這組號碼未必由編碼機構分配,更未必對應資料庫中的商品。收銀系統仍要查詢品名與價格,庫存系統也要確認供應商和包裝層級。

因此,網站表單可先用檢查碼提醒使用者可能抄錯,伺服器端卻不能因此省略資料庫驗證、權限檢查或交易確認。格式有效、資料存在與來源可信,是三個不同問題。

結語

條碼末碼是檢查碼,用來驗證前面數字是否通過加權模運算,從而偵測掃描或輸入錯誤。它提升結帳可靠度,卻不是加密防偽。下次結帳嗶不過去,可能只是污損造成檢查失敗;清潔重掃,往往比懷疑「系統壞了」更接近真相。