Algoritmo de Luhn

09/04/2008 - 18:57 por Tonic | Informe spam
Hola!

Me han dado la tarea de crear un algoritmo de validación de Luhn. Me
pasan cadenas numéricas de diferente longitud, acabadas en 0 y luego
un número de validación, y mediante este algoritmo de Luhn se ha de
comprobar si ese número de validación es el correcto.

El problema es que mi limitado conocimiento de Transact-Sql no me
permite hacer el algoritmo de una forma correcta.

Alguien tiene alguna idea de cómo hacerlo?

Saludos y gracias!!!
Tonic

Preguntas similare

Leer las respuestas

#1 Carlos M. Calvelo
09/04/2008 - 20:04 | Informe spam
Hola Tonic,

On 9 apr, 18:57, Tonic wrote:
Hola!

Me han dado la tarea de crear un algoritmo de validación de Luhn. Me
pasan cadenas numéricas de diferente longitud, acabadas en 0 y luego
un número de validación, y mediante este algoritmo de Luhn se ha de
comprobar si ese número de validación es el correcto.

El problema es que mi limitado conocimiento de Transact-Sql no me
permite hacer el algoritmo de una forma correcta.

Alguien tiene alguna idea de cómo hacerlo?




Google is your friend!

Mira si puedes sacar algo de esta discusión:
http://www.sqlteam.com/forums/topic...PIC_IDv195

Saludos,
Carlos
Respuesta Responder a este mensaje
#2 Gux (MVP)
09/04/2008 - 20:09 | Informe spam
El algoritmo es algo como esto:

numero:vector[1..16] de enteros; //los 16 dígitos a validar
suma,x,y,ultimoDigito:enterosuma:=0
para x:=1 hasta 15
Si x es impar
y:=numero[x]*2
Si y>
y:=y-9; //como sumar sus dos digitos
finSi
si no
y:=numero[x];
finSi
suma:=suma+y
finPara
suma:-(suma mod 10)
Si suma
suma:=0;
ultimoDigito=suma

Obtenido el último dígito, solamente queda comprobar si
numero[16]=ultimoDigito


Haga usted el ejercicio de escribir un script T-SQL equivalente y si se le
dificulta algo específico, díganos qué.

En mi opinión la única dificultad es que T-SQl no dispone de arreglos por lo
que usted deberá simularlo, puede obtener ideas en:

Arrays and Lists in SQL Server 2005
http://www.sommarskog.se/arrays-in-sql-2005.html

Gustavo Larriera, Microsoft MVP
https://mvp.support.microsoft.com/profile/gux
Este mensaje se proporciona tal como es, sin garantías de ninguna clase.



"Tonic" wrote:

Hola!

Me han dado la tarea de crear un algoritmo de validación de Luhn. Me
pasan cadenas numéricas de diferente longitud, acabadas en 0 y luego
un número de validación, y mediante este algoritmo de Luhn se ha de
comprobar si ese número de validación es el correcto.

El problema es que mi limitado conocimiento de Transact-Sql no me
permite hacer el algoritmo de una forma correcta.

Alguien tiene alguna idea de cómo hacerlo?

Saludos y gracias!!!
Tonic

Respuesta Responder a este mensaje
#3 Tonic
09/04/2008 - 20:25 | Informe spam
Pues muchísimas gracias :-))

Saludos!
Tonic
Respuesta Responder a este mensaje
#4 Tonic
09/04/2008 - 20:26 | Informe spam
Gracias!
Si en algún punto no lo sé continuar ya concretaré la duda.

Saludos!
Tonic
Respuesta Responder a este mensaje
#5 Tonic
10/04/2008 - 10:38 | Informe spam
Hola, ya está. Lo pongo aquí para que los más sabios me corrijan el
código inútil que habré creado, pero también para que los que lo
necesiten lo tengan:

CREATE PROCEDURE dbo.spValidarNumero
@inNumeroAutoriz varchar(20),
@outResult int OUTPUT

AS

declare @aux int
declare @digitocontrol int
declare @numero int
declare @sumaimpar int
declare @sumapar int
declare @sumaaux int
declare @cadena varchar (20)

/* Primero tomamos el dígito de más de la derecha del parámetro
inNumeroAutoriz*/
set @digitocontrol = RIGHT (@inNumeroAutoriz, 1)

set @outResult = 0


/* Nos quedamos con el número sin el último dígito y le damos la
vuelta */
set @cadena = LEFT (@inNumeroAutoriz, LEN(@inNumeroAutoriz)-1)
set @cadena = REVERSE (LTRIM(RTRIM(@cadena)))

/* Recorremos los impares */
SELECT @numero = 0, @sumaimpar = 0, @aux = 1, @sumaaux = 0

while @aux <= LEN (@cadena)
begin
set @numero= CAST (SUBSTRING (@cadena, @aux, 1) AS int)
set @numero = @numero * 2
número - 9
if (@numero >= 10) set @numero = @numero - 9
set @sumaimpar = @sumaimpar + @numero

set @aux = @aux + 2
end

/*Ahora los pares*/
SELECT @numero = 0, @sumapar = 0, @aux = 2

while @aux <= LEN (@cadena)
begin
set @numero= CAST (SUBSTRING (@cadena, @aux, 1) AS int)
set @sumapar = @sumapar + @numero
set @aux = @aux + 2
end
SELECT @sumaaux = 0, @numero = 0

resta del multiplo mayor de 10 del resultado menos 10. Ha de ser el
dígito de control
set @sumaaux = @sumaimpar + @sumapar

set @sumaaux = 10-(@sumaaux % 10)

SELECT @sumaaux = @sumaaux - @digitocontrol
if @sumaaux = 0 set @outResult = 1
GO


Saludos!!
Tonic
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida