選單

沒有校驗位的號碼:為什麼有些編號驗不了

有些編號天生沒有公開的校驗規則,只能確認格式。本文說明哪些號碼落在這一類、為什麼無法用演算法判斷,「僅格式」這個結論該怎麼理解,以及實作時四種結論的措辭為什麼重要。

發佈於

  • 僅格式
  • 編號

不是所有編號都設計成可以自我檢查。有些制度從一開始就沒有把校驗位放進號碼裡,有些則是有規則但沒有對外公布。本文說明這一類號碼為什麼驗不了、工具在這種情況下能說什麼,以及為什麼把結論分成四態比只回一句有效或無效更誠實。

哪些號碼沒有公開校驗位?

常見的有兩類。第一類是純流水號:發號單位只需要保證號碼不重複,並且在它的登記冊裡能找到對應項,於是就沒有動機在號碼裡加一位校驗。第二類是有內部規則、但沒有對外公布演算法的方式。

還有一類介於中間:號碼帶有意義的分段,例如標示所屬類別或地區,但段與段之間沒有數學關係。它看起來很規律,卻不能靠計算確認,只能靠比對已知的段位清單。

分辨這幾類的實務判準很簡單:如果規則說明裡沒有任何「由前面的位算出最後一位」的描述,就不要假設它存在。這個假設一旦寫進程式,就會產生一批無中生有的失敗。

還有一種情況要留意:同一個制度在不同時期核發的號碼,規則可能不同。早期沒有校驗位的號碼,在制度改版後仍然流通,於是同一個欄位裡會混著兩種性質的值。面對這種資料,只能逐筆判斷它屬於哪一期,而不能用單一規則一體適用。

為什麼有些編號天生無法用演算法校驗

因為校驗位不是編號的必要成分,而是一種額外的設計選擇。要加上它,發號單位必須願意犧牲一位的容量、願意公布算法,並且接受既有號碼無法回頭修改的代價。這三個條件不見得同時成立。

沒有校驗位的號碼通常靠別的機制防錯。例如比對登記冊、限制輸入來源,或者由發號單位在受理時當場核對。這些機制的效果可能不差,但它們都需要外部資料,離線的驗證器做不到。

另一個原因是成本。要在號碼裡放進校驗位,就得先說服所有既有的發號與受理單位一起改,包含已經印好的文件與已經建好的系統。制度改動的協調成本往往遠高於加一位數字的好處,於是這件事就長期擱著。

理解這一點之後,「驗不了」就不再是一個缺陷,而是一句關於制度設計的客觀描述。工具能做的,是誠實地把自己的能力邊界畫出來。

「僅格式」到底是什麼意思

它是四種結論之一,意思是:這串輸入符合某個制度公布的格式,但該制度沒有公布可用的校驗演算法,因此工具無法再往下判斷。

它與「校驗通過」的差別在於有沒有真的算過。前者是「我沒有規則可算」,後者是「我算了,而且成立」。兩者都不等於號碼真實存在,但混用會讓使用者誤以為系統做了更多的事。

它與「無法辨識」也不同。無法辨識是連格式都沒對上任何已知制度;僅格式則至少對上了其中一個。把兩者合併成一句「號碼有問題」,等於把兩種完全不同的情況一起抹掉。

還有一個界線要畫清楚:僅格式講的是這個制度,而不是這個號碼。同一個輸入可能在另一個制度下是可以完整校驗的,只是在目前的候選清單裡沒有那一個。因此顯示僅格式時,最好同時說明它是相對於哪一個制度得出的結論。

只有格式的號碼該怎麼驗?

做法是把能確認的部分確認完,然後停在該停的地方。具體來說:確認長度、確認可用字元集、確認是否符合分段結構,最後回報僅格式。

不要為了讓畫面好看而補上一個假結論。例如把僅格式顯示成綠色的通過,或顯示成紅色的失敗,都會誤導使用者。比較好的呈現是中性色,並在說明文字裡寫清楚為什麼只能到這裡。

如果業務上真的需要更高的確定性,那要走的是另一條路:向發號單位或登記體系查詢。這一步是資料查詢,不是演算法,兩者在系統裡應該清楚分開。

查詢的回應也要設計。外部體系可能回覆查無此號,但查無此號不等於號碼造假,也可能只是尚未同步或跨區查不到。這種回應應該與校驗失敗使用不同的措辭,否則使用者會把查詢的限制當成號碼的缺陷。

格式校驗仍然有價值的地方

雖然它不能證明號碼是真的,但它能擋掉大量低級錯誤:抄錯位數、夾進不相關的字元、把兩個欄位貼在一起、前後多了空白。這些都是實務上最常見的失敗,格式層級就能攔下。

它還有第二個價值:在批次匯入時當成第一道篩子。格式不符的資料先被挑出來,後續的人工審核或查詢就能集中在真正需要判斷的資料上。這比讓整批資料一起進查詢流程有效率得多。

第三個價值是提示。當使用者輸入一個明顯短少位數的號碼時,立刻回報比讓它進入下一步才失敗要好。這與四態結論的分工是一致的:能確定的先確定,不能確定的不要假裝。

最後一點與效能無關,而是與信任有關。使用者會記得哪一次系統把他的正確輸入判成錯誤。若系統在沒有規則時誠實說不知道,使用者的容忍度反而更高;相反地,若系統每次都給一個斬釘截鐵的錯誤答案,信任很快就會用完。

給開發者:四態結果與措辭

把通過與不通過改成四態,是這一類系統最值得做的一項調整。四種結論與它們該有的措辭方向:

  • 校驗通過:說明它通過了該制度公布的校驗位演算法,不要寫成有效。
  • 校驗失敗:說明格式符合但校驗位不成立,這是最明確的一種失敗。
  • 僅格式:說明該制度沒有公布演算法,只能確認格式。
  • 無規則:說明本站沒有對應的公開制度,並強調這不代表號碼是假的。
  • 格式不符:說明長度或字元集就不符合,並指出期望的長度範圍。

這四種措辭應該集中在一個地方管理,而不是散在畫面各處各自編寫。理由很實際:這類文字日後一定會因為規則調整而修改,散在各處就一定會漏改,最後同一種情況在不同頁面出現不同說法。

想從頭理解這三層判斷怎麼分工,可以讀號碼校驗的原理;四態結論要怎麼在介面上呈現與回傳,寫在介面邊界的校驗。

下一步

挑一個你目前以有效或無效二分的欄位,改成四態輸出,並為每一態寫一句說明。改完之後用號碼校驗工具測幾組明顯是構造值的輸入,特別留意那些應該落在僅格式與無規則的情況有沒有被誤標。

本文示範的都是構造值。沒有公開校驗演算法的號碼只能看格式,文章本身不對任何號碼的真實性、歸屬或可用性下判斷。

繼續閱讀

卡號與身分證號校驗工具相關文章