Contrôle de cohérence par algorithme de clef de LUHN

L’algorithme de la clé de Luhn sert à vérifier les données de différents identifiants numériques tels que les SIREN, SIRET, les n° de cartes bancaires, les n° ADELI…

Principe :
Pour un nombre à n chiffres on détermine le dernier chiffre, appelé clé de Luhn, à partir des n − 1 premiers chiffres.

L’algorithme procède en trois étapes.
1) Pour un chiffre sur 2 en partant du 2e, on le double. S’il est plus grand que 9 on additionne les deux chiffres.
2) On somme alors ces chiffres obtenus avec les chiffres n’ayant pas été traité à l’étape 1, y compris la clef
3) Si le modulo de cette somme par 10 est zéro, la clef est valide.

Exemple : soit le numéro SIREN 111111175, le chiffre 5 est la clé de 11111117.


1) 2*1, 2*1, 2*1, 2*7 => 2, 2, 2, 14 => 2,  2,  2,  5  
2) 1 + 1 + 1 + 1 + 5                  + 2 + 2 + 2 + 5 = 20
3) 20 modulo 10 = 0

Nombre valide

Voici sa traduction en Transact SQL (MS SQL Server) :


CREATE FUNCTION dbo.F_CHECK_LUHN (@DATA VARCHAR(32))
RETURNS BIT
AS
/******************************************************************************  
* Fonction de contrôle de cle de Luhn                                         *
*******************************************************************************  
* Fred. Brouard - http://sqlpro.developpez.com - www.sqlspot.com - 2009-06-07 *  
*******************************************************************************  
* Algorithme :                                                                *
*  1) Pour un chiffre sur 2 en partant du 2e, on le double. S'il est plus     *
*     grand que 9 on additionne les deux chiffres.                            *
*  2) On somme alors ces chiffres obtenus avec les chiffres n'ayant pas été   *
*     traité à l'étape 1, y compris la clef                                   *
*  3) Si le modulo de cette somme par 10 est zéro, la clef est valide.        *
*                                                                             *
* Exemple :                                                                   *
* soit le numéro SIREN 111111175, le chiffre 5 est la clé de 11111117.        *
* 1) 2*1, 2*1, 2*1, 2*7 => 2, 2, 2, 14 => 2,  2,  2,  5                       *
* 2) 1 + 1 + 1 + 1 + 5                  + 2 + 2 + 2 + 5 = 20                  *
* 3) 20 modulo 10 = 0                                                         *
* Nombre valide                                                               *
******************************************************************************/  
BEGIN
-- valeurs limites
IF @DATA IS NULL OR @DATA = '' RETURN NULL;
-- vérification que la chaine ne contient que des chiffres
DECLARE @I SMALLINT, @C CHAR(1);  
DECLARE @T TABLE (I SMALLINT, N SMALLINT);
SET @I = 1
WHILE @I <= LEN(@DATA)
BEGIN
   SET @C = SUBSTRING(@DATA, @I, 1);
   IF @C NOT BETWEEN '0' AND '9' RETURN NULL;
      ELSE INSERT INTO @T VALUES (@I, CAST(@C AS SMALLINT));
   SET @I = @I + 1
END;
-- algorithme
-- multiplication par deux des chiffres 1 sur 2
UPDATE @T
SET    N = N * 2
WHERE  I % 2 = 0;
-- addition des chiffres supérieur à 9
UPDATE @T
SET    N = N - 9  
WHERE  N > 9;
-- sommation
SELECT @I = SUM(N)
FROM   @T;
-- test
RETURN CASE WHEN @I % 10 = 0 THEN 1 ELSE 0 END
END


Frédéric BROUARD, Spécialiste modélisation, bases de données, optimisation, langage SQL.
Le site sur le langage SQL et les S.G.B.D. relationnels : http://sqlpro.developpez.com/
Expert SQL Server http://www.sqlspot.com : audit, optimisation, tuning, formation
* * * * * Enseignant au CNAM PACA et à l’ISEN à Toulon * * * * *

Une réflexion au sujet de « Contrôle de cohérence par algorithme de clef de LUHN »

  1. Avatar de od999od999

    Bonjour,

    etes vous sur que ce code fonctionne pour les siret ?

    exemple :
    select dbo.F_CHECK_LUHN (422260208) : SIREN validé
    select dbo.F_CHECK_LUHN (42226020800026) : SIRET non validé

    Pas de problème constaté avec les siren.

    Cdlt.

    OD

Laisser un commentaire