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