Ellenőrzőszám generálása (MySQL)

Posted by reho on márc 2, 2011 in Technológia | 0 comments

Sokszor szükséges, hogy a felhasználók által begépelt számokat valamilyen szinten ellenőrizni tudjuk. Ilyen esetekben szokás a számsorozatot már eleve úgy kinyomtatni/elküldeni/publikálni, hogy az a későbbi bevitel folyamán már tartalmazzon egy ellenőrző számot.

Egy ilyen módszer CDV algoritmus. Lényege, hogy a számsorozat számjegyeit összeadjuk, de úgy, hogy minden második számjegynek a háromszorosát adjuk az összesítőhöz. A végén az 1 digites ellenőrző számunk az összeg utolsó számjegye, azaz a 10-el való osztásának maradéka lesz.

PHP-ban, vagy javascript-ben a megvalósítása viszonylag egyszerű, de jómagam a mysql függvényeit és szintaktikáját még nem forgatom olyan hatékonysággal, mint ahogy az előbbi nyelvekét.

Az én helyzetemben ráadásul a számok már az ellenőrző kóddal vannak tárolva, és a következő értéket is ebből kell előállítanom.

Jöjjön tehát a függvény:

CREATE DEFINER=`root`@`localhost` FUNCTION `createReferenceNumber`() RETURNS int(11)
    READS SQL DATA
BEGIN

    DECLARE _i INT;
    DECLARE _cdv INT;
    DECLARE _maxref INT;
    DECLARE _maxref_char VARCHAR(10);

    SELECT MAX(reference_number) INTO _maxref FROM voucher;

    IF _maxref = 0 THEN
         -- default
         SET _maxref = 80000000;
    END IF;

    SET _maxref_char = TRIM(CONVERT((FLOOR(_maxref / 10) + 1), CHAR(10))); -- remove old CDV number    

    SET _i = 1;
    SET _cdv = 0;
    WHILE _i < LENGTH(_maxref_char) +1 DO
        IF _i % 2 = 0 THEN
            SET _cdv = _cdv + CONVERT(SUBSTRING(_maxref_char, _i, 1), UNSIGNED);
        ELSE
            SET _cdv = _cdv + CONVERT(SUBSTRING(_maxref_char, _i, 1), UNSIGNED) * 3;
        END IF;
        SET _i = _i + 1;
    END WHILE;

    SET _maxref = CONVERT(_maxref_char, UNSIGNED) * 10 +(_cdv % 10);

    RETURN _maxref;
END

A fenti példában a voucher adattáblából keressük ki az utolsó már ellenőrzőkóddal ellátott értéket és ebből állítjuk elő a következő értéket amit ellátunk a CDV számmal.
PHP-ban a következőképpen néz ki:

public static function CDV($number) {
    if (!is_numeric($number)) return -1;

    for ($i=0; $i<strlen((string)$number); $i++) {
        if ( $i % 2 == 1) {
            $retval += substr($number, $i, 1);
        } else {
            $retval += substr($number, $i, 1) * 3;
        }
    }
    return (string)$number . (string)($retval % 10);
}

Amikor a felhasználó visszagépeli vagy esetleg az OCR alrendszer beszúrja a felsimert kódot, könnyedén tudjuk ellenőrizni, hogy sérült-e a kód vagy sem. A módszer nem garantál 100%-os hibafelismerést, de egy tévesztésnél biztosan felismeri a hibás kódot.

Létezik egy másik típusú ellenőrző kód is, azt majd a következő bejegyzésben ismertetjük.

Leave a Reply

Spam Protection by WP-SpamFree