Article complet: Contrôle de cohérence par algorithme de clef de LUHN

02/07/2009

[SGBD][SQL Server] 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...

[Suite:]

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 * * * * *

Social Bookmarking:

                                     

Commentaires, Pingbacks:

Connectez-vous pour vous abonner à cet article:

Flux de commentaires pour cet article : Atom 1.0  RSS 2.0
Commentaire de: od999 [Membre]
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
Permalien 10/11/2009 @ 12:01

Vous devez être identifié pour poster un commentaire.

Liste des blogs

< Le blog de SQLpro/>

Fred Brouard alias SQLpro

Rechercher

<  Novembre 2011  >
Lun Mar Mer Jeu Ven Sam Dim
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30        

Syndiquez ce blog XML

Articles :

Commentaires :

 
 
 
 
Partenaires

Hébergement Web