Create new function in postgres db , like,
calculateVerhoeff() returns an integer single digit which is the checksum to be used -- verifyVerhoeff() returns a boolean, true for number is valid, false for invalid
CREATE OR REPLACE FUNCTION checksumVerhoeff(num numeric, calcChecksum boolean) RETURNS integer LANGUAGE plpgsql AS $$ DECLARE d CHAR(100) := '0123456789123406789523401789563401289567401239567859876043216598710432765982104387659321049876543210'; p CHAR(80) := '01234567891576283094580379614289160435279453126870428657390127938064157046913258'; inv CHAR(10) := '0432156789'; c integer := 0; len integer; m integer; i integer := 0; n VARCHAR(255); BEGIN /* Start Processing */ n := REVERSE(num::varchar); len := LENGTH(n); WHILE (i < len) LOOP IF calcChecksum THEN /* Do the CalcChecksum */ m := substring(p,(((i+1)%8)*10)+ substring(n,i+1,1)::integer+1,1)::integer; ELSE /* Do the Checksum */ m := substring(p,((i%8)*10)+ substring(n,i+1,1)::integer+1,1)::integer; END IF; c := substring(d,(c*10+m+1),1)::integer; i:=i+1; END LOOP; IF (calcChecksum) THEN /* Do the CalcChecksum */ c := substring(inv,c+1,1)::integer; END IF; RETURN c; END $$; CREATE OR REPLACE FUNCTION verifyVerhoeff(num numeric) RETURNS boolean LANGUAGE plpgsql AS $$ BEGIN RETURN 0 = checksumVerhoeff(num, false); END $$; CREATE OR REPLACE FUNCTION calculateVerhoeff(num numeric) RETURNS integer LANGUAGE plpgsql AS $$ BEGIN RETURN checksumVerhoeff(num, true); END $$;
After Create this function in db ,
you can use
select calculateverhoeff('12345679') it returned the 7
select verifyverhoeff('123456797') last digit is returned value of calculateverhoeff function
now it will return TRUE or False , i .e t or f
for further reference :
https://en.wikibooks.org/wiki/Algorithm_Implementation/Checksums/Verhoeff_Algorithm#PHP
Comments
Post a Comment