Elke winkelbarcode eindigt met een cijfer dat helemaal geen deel uitmaakt van de identiteit van het artikel. Het is rekenkunde: een gewogen som van de cijfers ervoor, teruggebracht tot één teken en gedrukt zodat een scanner, of een persoon die de gedrukte cijfers onder de strepen leest, kan zien of de code intact is gebleven.
EAN en UPC zijn de twee families die de meeste mensen het eerst tegenkomen, en ze zijn nauw genoeg verwant dat dezelfde routine vaak beide verwerkt. De verschillen zijn klein, positioneel en gemakkelijk fout te doen, en daarom concentreert dit artikel zich op waar de rekenkunde begint in plaats van op de rekenkunde zelf.
Waar komt het laatste cijfer van een barcode vandaan?
Het patroon is het bekende. Elk van de voorafgaande cijfers wordt met een gewicht vermenigvuldigd, de producten worden opgeteld, en de som wordt omgezet in één afsluitend teken. Voor de barcodefamilies die hier worden beschreven wisselen de gewichten af tussen één en een grotere waarde, en het afsluitende cijfer wordt afgeleid door de som naar het volgende veelvoud van tien te brengen.
Het doel is nauw en specifiek. Een barcode wordt gelezen door een machine die een streep kan mislezen, en het afsluitende cijfer is er om de meeste mislezingen duidelijk te maken voordat het verkeerde product wordt gefactureerd. Het is een foutdetectiemiddel voor een ruisig kanaal, geen certificaat van wat dan ook.
Omdat de som altijd alleen de cijfers in de code zelf dekt, kan het afsluitende cijfer uit elke kandidaatreeks opnieuw worden berekend. Dat maakt de controle goedkoop genoeg om bij elke scan te draaien, en het is ook de reden dat een passerende code geen bewijs is over het product erachter.
De codes in dit artikel worden beschreven in plaats van afgedrukt. Geen echte productbarcode wordt weergegeven, en een beschreven schema is een openbare conventie in plaats van een bewering over enig artikel in enige winkel.
EAN-13 en UPC-A: twee gangbare lengtes, verschillende startpunten van de weging
De twee families delen hun rekenkunde en verschillen in de details eromheen.
| Eigenschap | EAN-13 | UPC-A |
|---|---|---|
| Totale lengte | De langste van de twee | De kortste van de twee |
| Gewichtspatroon | Afwisselend, beginnend aan één kant | Afwisselend, beginnend aan de andere kant |
| Waar hij te zien is | Winkelartikelen internationaal | Winkelartikelen in Noord-Amerika |
| Relatie | De kortere code kan met een toegevoegd voorloopcijfer in de langere worden gedragen | Een deelverzameling van dezelfde rekenkundige familie |
De relatie tussen hen is de reden dat bibliotheken vaak één functie aanbieden die eerst de lengte bepaalt en dan het startpunt van de weging kiest. Een routine die ongeacht de lengte één gewichtspatroon aanneemt, berekent een controlecijfer dat fout is voor elke code van de andere omvang — en doet dat met vertrouwen, met een waarde die pas faalt wanneer hij echte data tegenkomt.
Namen zijn hier het nauwkeurig gebruiken waard. EAN-13 en UPC-A zijn standaardaanduidingen voor twee specifieke formaten, en elk winkelnummer met een van beide aanduiden is een kleine gewoonte die tot een echte bug leidt zodra een routine beide moet accepteren.
Het idee van wegen vanaf rechts
De gewichten wisselen af, en de vraag die de correctheid bepaalt is welke positie welk gewicht krijgt. In deze schema’s is de afwisseling verankerd aan de rechterkant, zodat het cijfer direct vóór het controleteken altijd hetzelfde gewicht draagt en het patroon van daar naar links groeit.
Verankeren vanaf rechts in plaats van links is wat één routine over lengtes heen laat werken. Als het patroon aan de linkerkant verankerd was, zou het toevoegen van een cijfer de pariteit van elke positie omdraaien en de betekenis van de code volledig veranderen. Verankeren aan de rechterkant betekent dat de onmiddellijke omgeving van het controleteken stabiel is en het extra cijfer helemaal links eenvoudigweg één term meer in de som is.
Dit is de meest voorkomende bron van off-by-one-fouten in barcodecode. Het is ook goedkoop te testen: genereer een geldige code, verifieer hem met de routine, breid hem dan met één voorloopcijfer uit en verifieer opnieuw. Een routine die aan de verkeerde kant is verankerd, zal het bij één van de twee lengtes oneens zijn.
Wat een barcodeprefix wel en niet zegt
De voorste cijfers van een winkelcode worden toegewezen aan nummerorganisaties, en de toewijzing is gepubliceerd. Het is verleidelijk ze te lezen als een bewering over waar een artikel is gemaakt, en die lezing is fout. De toewijzing identificeert de organisatie die het nummer heeft geregistreerd, en een geregistreerde organisatie kan goederen overal ter wereld laten maken.
Het fysieke drukken van labels voegt een tweede laag losheid toe. Hetzelfde artikel kan een code dragen die in het ene land is gedrukt en in een ander land zijn verpakt, en een bedrijf kan registraties onder meer dan één toewijzing hebben. De prefix als herkomstmarkering van de productie behandelen levert zelfverzekerde, onjuiste herkomstbeweringen op.
Voor een ontwikkelaar is dit een waarschuwing voor uitdijende scope. De barcode kan je vertellen of de cijfers intern consistent zijn, en hij kan je vertellen welke organisatie het nummer heeft geregistreerd als je de gepubliceerde toewijzing raadpleegt. Alles daarbuiten hoort bij een ander systeem met andere data.
Betekent een geslaagde controle dat de barcode zal scannen?
Nee, en de twee fouten zijn het onderscheiden waard. Het controlecijfer waakt ertegen dat de cijfers fout zijn; het zegt niets over het drukwerk. Strepen die zijn uitgesmeerd, afgesneden, op de verkeerde vergroting of op een gebogen oppervlak zijn gedrukt, kunnen een scanner verslaan ook al zijn de cijfers eronder volkomen consistent.
Een correcte code bewijst ook niet dat het artikel in je catalogus bestaat. Een goed gevormde code kan verwijzen naar een artikel dat je nooit op voorraad hebt gehad, of naar een code die helemaal nooit is toegewezen. Cataloguslidmaatschap en rekenkundige consistentie zijn onafhankelijke eigenschappen, en daarom heeft een proces voor goederenontvangst zowel een opzoeking in zijn eigen lijst als een validatiestap nodig.
Het omgekeerde geval is net zo belangrijk. Een mislezing die een scanner stil corrigeert, of een code die de controle niet haalt omdat het label beschadigd was, is geen bewijs van fraude. Het is bewijs over het label.
Voor ontwikkelaars: bulkscans en fouten lokaliseren
Barcodevalidatie komt meestal in bulk, wat twee kleine ontwerpbeslissingen tot grote maakt.
- Bepaal de lengte uit de cijfers alleen, en kies dan de start van de weging uit de lengte. Vertrouw er niet op dat een aanroeper aangeeft welke familie hij stuurt.
- Wijs onwettige tekens af voordat de som draait, zodat een geplakte beschrijving geen mysterieuze checksumfout wordt.
- Zeg bij een fout of de lengte verkeerd was of het afsluitende cijfer niet overeenkwam; die twee meldingen sturen een gebruiker naar volledig verschillende oplossingen.
- Meld bij het controleren van een bestand de rij en de waarde zoals ontvangen, zodat een magazijnmedewerker het betreffende label kan vinden.
Elk schema hier behoort tot dezelfde op modulus gebaseerde familie als de andere die in het overzicht van controlecijferalgoritmen worden beschreven, wat nuttig is wanneer één routine meerdere soorten codes moet bedienen. Boek- en serienummers volgen hetzelfde principe met hun eigen eigenaardigheden, behandeld in ISBN ISSN-controlecijfers.
Volgende stappen
Kies één geldige code van elk van de twee lengtes en bevestig dat je routine beide accepteert, wijzig dan in elk één cijfer en bevestig dat hij beide afwijst. Controleer daarna wat je systeem doet wanneer de rekenkunde klopt maar de code niet in je catalogus voorkomt — de nummervalidatietool laat zien hoe een validator een resultaat hoort te formuleren dat alleen over de cijfers gaat.