條碼最後一位數,能替我們檢查什麼?
它不是商品的另一項資料,而是替前面的數字設下一道算術檢查。多留一點重複,能讓錯誤留下痕跡,卻不保證知道正確答案。
拿起一本書,背面的 ISBN 有一長串數字。假如把其中一位抄錯,電腦有時不必先查書目,就能提醒這個號碼不對。它沒有讀過那本書,也不必認得出版社。線索藏在最後一位:那不是另一項獨立資料,而是由前面的數字算出的檢查碼。問題是,只多放一位數,究竟能檢查到什麼?
一、先分清號碼、條紋和資料庫
國際 ISBN 總部把 ISBN 定位為出版品的識別碼,用來區分特定書名、版本與產品形式。例如,同一本作品的平裝本和 EPUB,應分別識別。它不是一本書內容的摘要,也不會因為有了 ISBN,就自動取得法律或著作權保護。
在零售商品上,類似的識別工作由 GTIN 等號碼負責;條碼讓設備能讀取這些號碼。GS1 的說明指出,一般商品的名稱與價格放在資料庫,掃描取得識別號碼後,再用它查出相關資料。另有把價格或折價金額納入的專用編碼,不能把所有條碼都當成同一種格式。
因此,至少有兩個不同問題:眼前這串數字有沒有讀錯,以及這串數字對應什麼東西。最後一位的檢查碼主要處理前者。它先檢查數字之間是否符合約定的關係,不必等到找到完整商品資料,才知道輸入可能有問題。
二、把總和補成十的倍數
以十三位的 GTIN-13 為例,GS1 公開了完整算法:前十二位從左到右,交替乘以 1 和 3,再把結果相加。最後一位要讓這個總和,補成十的倍數。如果原本已經是十的倍數,最後一位就是 0,不是 10[3]。
GS1 的示範號碼是 629104150021。把第 1、3、5、7、9、11 位相加,得到 18;第 2、4、6、8、10、12 位相加,得到 13,再乘以 3,得到 39。兩邊合計 57,距離下一個十的倍數 60 還差 3,所以完整號碼是 6291041500213。
檢查時則反過來:前十二位照規則計算,再加上最後的 3,總和是 60,就通過這道算術檢查。這裡的 3 不是隨手挑選,也不是某項商品屬性;前面的十二位一旦確定,它的值就跟著確定。
三、為什麼不直接把數字相加?
如果只把所有位數相加,12 寫成 21,總和完全不變。交替使用不同權重,能讓位置也參與檢查:1 × 1 加 2 × 3 是 7;交換後,2 × 1 加 1 × 3 只剩 5。兩個相鄰數字對調,就有機會留下不同的餘數。
對 GTIN-13 這套規則而言,只改錯其中一個數字,總和不會仍然維持十的倍數。即使那一位乘了 3,改動量也不會剛好被十整除。大學的檢查碼教材也說明,這類權重設計和模十運算,正是單一位數錯誤能被偵測的原因[4]。
但相鄰交換並非全都抓得到。把 5 × 3 加 0 × 1 換成 0 × 3 加 5 × 1,總和只差 10,最後的餘數相同。示範號碼中的 50 因此可以交換成 05,仍通過檢查。這不是電腦漏算,而是這套規則本來就難以避免的情況。
四、通過檢查,不等於找到了真相
下面三行示例使用同一個檢查碼 3。第二行只把一位 4 改成 5;第三行則交換相鄰的 5 和 0。兩種錯誤的結果不一樣。
| 號碼 | 加權總和含末位 | 算術檢查 |
|---|---|---|
6291041500213 | 60 | 通過(GS1示例) |
6291051500213 | 63 | 未通過(4改成5) |
6291041050213 | 50 | 通過(50交換成05) |
按GS1規則進行計算;後兩行僅示範錯誤,並非實際商品號碼。
更重要的是,不符合規則通常也沒有告訴我們,到底哪一位錯了。可能是前面某位抄錯,也可能是最後一位錯了。若把檢查碼直接重算、改到能通過,只是讓一組數字重新符合關係,不是把原先想輸入的號碼找回來。
反過來,符合規則的號碼,也可能根本未被分配,或對應到另一項商品。GS1 的查詢服務分別處理號碼結構、是否由 GS1 發出、授權給哪家公司,以及產品資料是否相符。這些需要登記資料的問題,不能靠最後一位的算術取代;就算號碼正確,也不能單憑這一點判定眼前的實物真偽。
五、舊書上的 X,來自另一套規則
翻看較早出版的書,有時會看到十位的 ISBN,最後甚至是字母 X。那不是印刷錯誤。舊制 ISBN-10 使用模十一運算:從左到右分別乘以 10、9,一路到 1,總和必須被 11 整除。最後一位若需要數值 10,就用 X 表示。
這套設計能偵測單一位數錯誤,以及兩個不同數字交換位置。十三位的 ISBN 則使用交替乘 1、3 的模十算法,和前面介紹的 GTIN-13 相同,也就有相鄰數字相差 5 時的交換盲點。位數更多,並不表示每一種錯誤都更容易抓到。
國際 ISBN 總部記錄,新配發的 ISBN 自 2007 年 1 月 1 日起改為十三位。把舊十位 ISBN 轉成對應的十三位號碼時,要先去掉原檢查碼,加上 978 前綴,再依新算法重算最後一位。不是在舊號碼前面接上三位,就能把舊的 X 原封不動留下。
六、抓到錯誤,和修回資料是兩種能力
手機能讀取部分髒污的 QR Code,和檢查碼有什麼不同?前面談的是錯誤偵測;QR Code 另加入更多冗餘資料,使用里德-所羅門碼(Reed-Solomon code),在能力範圍內可以修復資料。DENSO WAVE 的說明也指出,提升錯誤修正能力,會增加所需資料量與符號大小。
但這不代表任意遮住一角都能成功。DENSO WAVE 明確提醒,能否恢復仍取決於污損程度。它列出的修復比例以碼字為單位,不等於保證同樣比例的紙面面積可以隨便擦掉。讀得到、修得回來,以及內容本身可信,仍是不同層次的問題。
回到書背上那個小小的檢查碼。它沒有多告訴我們作者是誰,卻讓數字之間多了一條可以核對的關係。這一點重複,換來的是某些錯誤不再悄悄混進下一步。可靠的系統不一定能立刻給出答案;有時,它先做到的是在不對的地方停下來。
查證資料來源8 項
完整來源集中於此,並註明對應章節與支持內容。正文僅保留算法與錯誤偵測兩處查證標記。
- What is an ISBN?(International ISBN Agency) ↗
- Are the description and price of the item included in the barcode?(GS1,2025-06-24) ↗
- How to calculate a check digit manually(GS1) ↗
- Check Digits(University College Dublin數學教材,2012-10-11) ↗
- Verified by GS1(GS1) ↗
- How is an ISBN used in a GS1 barcode?(GS1,2024-08-30) ↗
- Error correction feature(DENSO WAVE) ↗
- What is a QR Code?(DENSO WAVE) ↗
延伸探討
把故事帶回自己的思考
當一個系統顯示「驗證通過」,你會再問它究竟檢查了格式、登記資料,還是眼前實物的真偽嗎?