home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The C Users' Group Library 1994 August
/
wc-cdrom-cusersgrouplibrary-1994-08.iso
/
listings
/
v_01_04
/
1n04032a
< prev
next >
Wrap
Text File
|
1990-05-02
|
5KB
|
163 lines
Joe Celko & Michael Smith
Sunset Blvd #304
Los Angeles, CA 90069
service: (213) 288-9690
325 words
CHECK DIGIT PROGRAMS
The following Pascal functions will compute the different check
digits given in the article. They assume that the program has
the following declarations global to them. N can be replaced by
a literal value in all of the programs for a particular
application, so these are more templates than programs. The
InfoDigits data type assumes that the number to be given a check
digit is stored in an array of integers, with the leftmost digit
in position one.
CONST
N = 10; { size of information digits string }
TYPE
InfoDigits = ARRAY [1..N] OF INTEGER;
FUNCTION MakeCheck(a : InfoDigits; n : INTEGER) : INTEGER;
{ This will generate Verhoeff's Dihedral Five check digit }
CONST
MultTable : ARRAY [0..9, 0..9] OF INTEGER =
(( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
( 1, 2, 3, 4, 0, 6, 7, 8, 9, 5),
( 2, 3, 4, 0, 1, 7, 8, 9, 5, 6),
( 3, 4, 0, 1, 2, 8, 9, 5, 6, 7),
( 4, 0, 1, 2, 3, 9, 5, 6, 7, 8),
( 5, 9, 8, 7, 6, 0, 4, 3, 2, 1),
( 6, 5, 9, 8, 7, 1, 0, 4, 3, 2),
( 7, 6, 5, 9, 8, 2, 1, 0, 4, 3),
( 8, 7, 6, 5, 9, 3, 2, 1, 0, 4),
( 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
PermTable : ARRAY [0..9, 0..9] OF INTEGER =
(( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
( 1, 5, 7, 6, 2, 8, 3, 0, 9, 4),
( 5, 8, 0, 3, 7, 9, 6, 1, 4, 2),
( 8, 9, 1, 6, 0, 4, 3, 5, 2, 7),
( 9, 4, 5, 3, 1, 2, 6, 8, 7, 0),
( 4, 2, 8, 6, 5, 7, 3, 9, 0, 1),
( 2, 7, 9, 3, 8, 0, 6, 4, 1, 5),
( 7, 0, 4, 6, 9, 1, 3, 2, 5, 8),
( 8, 1, 2, 3, 4, 5, 6, 7, 8, 9),
( 9, 5, 7, 6, 2, 8, 3, 0, 9, 4));
InverseTable : ARRAY [0..9] OF INTEGER =
( 0, 4, 3, 2, 1, 5, 6, 7, 8, 9);
VAR
Check, i : INTEGER;
BEGIN
Check := 0;
FOR i := 1 TO n
DO Check := MultTable[Check, PermTable[(i MOD 8), a[i]]];
MakeCheck := InverseTable[Check];
END;
FUNCTION VerifyCheck(a : InfoDigits; n : INTEGER) : BOOLEAN;
{ This will verify Verhoeff's Diheral Five check digit. Note
that it is different from the generator }
CONST
MultTable : ARRAY [0..9, 0..9] OF INTEGER =
(( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
( 1, 2, 3, 4, 0, 6, 7, 8, 9, 5),
( 2, 3, 4, 0, 1, 7, 8, 9, 5, 6),
( 3, 4, 0, 1, 2, 8, 9, 5, 6, 7),
( 4, 0, 1, 2, 3, 9, 5, 6, 7, 8),
( 5, 9, 8, 7, 6, 0, 4, 3, 2, 1),
( 6, 5, 9, 8, 7, 1, 0, 4, 3, 2),
( 7, 6, 5, 9, 8, 2, 1, 0, 4, 3),
( 8, 7, 6, 5, 9, 3, 2, 1, 0, 4),
( 9, 8, 7, 6, 5, 4, 3, 2, 1, 0));
PermTable : ARRAY [0..9, 0..9] OF INTEGER =
(( 0, 1, 2, 3, 4, 5, 6, 7, 8, 9),
( 1, 5, 7, 6, 2, 8, 3, 0, 9, 4),
( 5, 8, 0, 3, 7, 9, 6, 1, 4, 2),
( 8, 9, 1, 6, 0, 4, 3, 5, 2, 7),
( 9, 4, 5, 3, 1, 2, 6, 8, 7, 0),
( 4, 2, 8, 6, 5, 7, 3, 9, 0, 1),
( 2, 7, 9, 3, 8, 0, 6, 4, 1, 5),
( 7, 0, 4, 6, 9, 1, 3, 2, 5, 8),
( 8, 1, 2, 3, 4, 5, 6, 7, 8, 9),
( 9, 5, 7, 6, 2, 8, 3, 0, 9, 4));
VAR
Check, i : INTEGER;BEGIN
Check := 0;
FOR i := 1 TO n
DO Check := MultTable[Check, PermTable[(i MOD 8), a[i]]];
VerifyCheck := (Check = 0);
END;
.PAGE
Bull Function :
FUNCTION BullCheck(a : InfoDigits; n, x, y : INTEGER) : INTEGER;
{ The most popular pairs (x, y), in order of increasing error
detection ability, are (4,5), (4,7), (3,7), (3,5), (5,6) and
(3,8). }
VAR
CheckX, CheckY, i : INTEGER;
BEGIN
CheckX := 0;
CheckY := 0;
FOR i := 1 TO n
DO IF (Odd(i))
THEN CheckX := CheckX + a[i]
ELSE CheckY := CheckY + a[i];
BullCheck := (CheckX MOD X)+ (CheckY MOD Y)
END;
.PAGE
Power Function :
FUNCTION PowerCheck(a : InfoDigits; base, x : INTEGER) : INTEGER;
{ base is usually 2 or 3. x is usually 7, 10 or 11. }
VAR
Check, i, Term : INTEGER;
BEGIN
Check := 0;
Term := 1;
FOR i := 1 TO n
DO BEGIN
Check := Check + (Term * a[i]);
Term := Term * base;
END;
PowerCheck := (Check MOD x)
END;
.PAGE
ISBN Function :
FUNCTION ISBNCheck(a : InfoDigits) : INTEGER;
VAR
Check, i : INTEGER;
BEGIN
Check := 0;
FOR i := 1 TO n
DO Check := Check + (i * a[i]);
ISBNCheck := (Check MOD 11)
{ Let calling program handle a value of 10
as it wishes. }
END;
--END--
Title: CHECK DIGIT PROGRAMS
Words: 325
Date: 1990 May 02
Sent to:
C Users Journal
R&D Publications
2601 Iowa Street
Lawrence, KS 66047