MOD10

Fra Wikipedia, den frie encyklopedi
Gå til: navigasjon, søk

MOD10 er forkortelse for Modulus 10 algoritmen, også kalt Luhn-algoritmen etter oppfinneren Hans Peter Luhn. Modulus 10 algoritmen benyttes bl.a. som beregningsmetode for et kontrollsiffer i KID-numre på bankenes innbetalingsblanketter.

Et tenkt KID-nummer er 2345676. Det siste sifferet i KID-nummeret er et kontrollsiffer. I eksempelet over er dette sifferet 6. KID-nummeret uten kontrollsiffer er 234567.

Beregning av kontrollsiffer med Modulus 10 algoritmen[rediger | rediger kilde]

Hvert siffer i eksempelet over multipliseres med vekttallene 2, 1, 2, 1 osv., regnet fra høyre mot venstre.

7 × 2 = 14 = 1 + 4 = 5
6 × 1 = 6
5 × 2 = 10 = 1 + 0 = 1
4 × 1 = 4
3 × 2 = 6
2 × 1 = 2

Tverrsummen er 5 + 6 + 1 + 4 + 6 + 2 = 24.

Merk: I Modulus10 adderer man ikke produktene, men de enkelte siffer i produktene. Produktet 14 gir altså bidraget 1 + 4 til tverrsummen. Entallsifferet i tverrsummen (i dette tilfellet 4 [resultatet av (24 % 10)]) trekkes fra 10 og resultatet blir kontrollsifferet (i dette tilfellet 6). Dersom entallssifferet i tverrsummen blir 10, blir kontrollsifferet 0.

10 – 4 = kontrollsifferet 6

Komplett og gyldig KID-nummer i dette eksempelet er derfor 2345676.

Behov for kontrollsiffer - Bakgrunn[rediger | rediger kilde]

Kontrollsifferet skal avdekke om det er gjort inntastingsfeil eller feil ved OCR-lesing. Denne algoritmen er best på å avdekke gale enkeltsifre, da ett enkelt siffer feil alltid vil gi et annet kontrollsiffer. Dersom flere sifre er feil, vil sjansene øke for at kontrollsifferet regnes ut til det samme og at feilen ikke oppdages. Om en tilfeldig tallrekke kontrolleres, er sjansen 10% for at siste siffer stemmer med kontrollsiffer-algoritmen.

Denne algoritmen er også designet til å avdekke en ting til: Dersom to siffer har byttet plass, vil kontrollsifferet bli et annet. Derfor brukes vekttallene 21212121.. osv. Denne typen feil er det noe økt sjanse for ved inntasting av lange KID-nummer.

Når det gjelder KID-nummer, kontrolleres også antall siffer det skal være, slik at et ekstra siffer eller et siffer for lite også gir feil KID.

Dersom et feil KID-nummer skulle slippe gjennom, er det to muligheter for mottakeren: Enten er KID-nummeret et annet gyldig nummer som er utstedt på en annen faktura, slik at betalingen knyttes til feil kunde, noe som kan være vanskelig å oppdage, og kan resultere i feil tilbakebetalinger. Den andre muligheten er at KID-nummeret ikke er tatt i bruk eller er en ugyldig KID. Dette vil mottakeren kunne avdekke, og vil kunne kontrollere nærmere hvem som har betalt manuelt. Jo kortere KID-nummer som benyttes (relativt til antall gyldige fakturaer), jo mer sannsynlig er det at feil som slipper gjennom resulterer i et annet benyttet nummer.

Lange KID-nummer som inneholder både kundenummer og fakturanummer regnes som meget sikre, siden feil i den ene eller den andre delen nesten alltid vil kunne oppdages. At feil i begge delene tilfeldigvis matcher en annens kundenummer/fakturanummer-kombinasjon er svært usannsynlig.

Implementasjoner i forskjellige programmeringspråk[rediger | rediger kilde]

Python[rediger | rediger kilde]

 kid_mod10 = lambda a: "%s%s" % (a, 10-(sum([int(n) for n in list("".join([str(int(val)*[2,1][idx%2]) for idx,val in enumerate(list(str(a))[::-1])]))])%10))

Haskell[rediger | rediger kilde]

 kid10 :: [Int] -> [Int]
 kid10 nr = nr ++ [ctrl $ sum (map tv2 multi)]
   where tv2 t = t `div` 10 + t `mod` 10
         multi = zipWith (*) (reverse nr) (cycle [2,1])
         ctrl k = 10 - (k `mod` 10)

[1]

  1. ^ Norwegian KID numbers