Famoso Algoritmo de La CI Uruguaya

7
Famoso Algoritmo de la CI Uruguaya!! 4 comentarios 17682 visitas 0 distinciones Bueno señores aca les explico de que se trata esto aunque me imagino que si alguna vez haz programado algo que tenga que ver con usuarios aca en uruguay tendrias que saberlo ya que con este algoritmo se puede controlar si la cedula existe o no, en cualquier lenguaje de programacion obvio XD! yo lo hice en java y me quedo impecable!!! Una de las cosas que más llaman la atención de nuestro documento de identidad es el número luego de la barra: 1234567-8 Quizá muchos ya lo sepan, se llama "Digito Verificador y resulta de una serie de cálculos con los numeros del documento. El cálculo es simple pero entreverado: Se toman los primeros siete numeros y se multiplican cada uno (respetando el lugar, es decir: primero x primero, segundo por segundo) por 2987634. Ejemplo: 1)Si la cedula es 1234567 la cuenta quedaría así: 1x2+2x9+3x8+4x7+5x6+6x3+7x4= 148. 2) Se toma el resultado y se le busca el numero mayor que termina en 0

Transcript of Famoso Algoritmo de La CI Uruguaya

Page 1: Famoso Algoritmo de La CI Uruguaya

Famoso Algoritmo de la CI Uruguaya!!

4 comentarios 17682 visitas 0 distinciones

Bueno señores aca les explico de que se trata esto aunque me imagino que si alguna vez haz programado algo que tenga que ver con usuarios aca en uruguay tendrias que saberlo ya que con este algoritmo se puede controlar si la cedula existe o no, en cualquier lenguaje de programacion obvio XD! yo lo hice en java y me quedo impecable!!!

Una de las cosas que más llaman la atención de nuestro documento de identidad es el número luego de la barra: 1234567-8Quizá muchos ya lo sepan, se llama "Digito Verificador y resulta de una serie de cálculos con los numeros del documento.El cálculo es simple pero entreverado: Se toman los primeros siete numeros y se multiplican cada uno (respetando el

lugar, es decir: primero x primero, segundo por segundo) por 2987634.

Ejemplo:1)Si la cedula es 1234567 la cuenta quedaría así:

1x2+2x9+3x8+4x7+5x6+6x3+7x4= 148.

2) Se toma el resultado y se le busca el numero mayor que termina en 0

y se le resta. Ej: 150-148= 2.

3) El número 2 es el dígito verificador para la cedula

1234567

Page 2: Famoso Algoritmo de La CI Uruguaya

Digito verificador cedula uruguaya

por iatech » Mié Nov 28, 2012 8:42 pm

Hola a todos esta es mi primer consulta en este foro, estoy necesitando verificar mediante un digito verificador la cedula uruguaya en una celda contigua a donde se ingrese el numero de cedula.A continuacion paso la forma en como se calcula dicho digito verificador.

Como calcular el digito verificador de la CI Uruguaya¿Es el número de cédula 1234567-2 es válido?

La Cédula de Identidad de la República Oriental del Uruguay es un documento emitido por la Dirección Nacional de Identificación Civil quien depende del Ministerio del Interior.Dicho documento tiene como propósito llevar registro de cada individuo sea oriundo o nacionalizado en la república.

El numero de una cédula de identidad tiene exactamente 7 dígitos al cual se le adiciona un dígito verificador.

Es así que un número valido debe respetar el siguiente formato:

a.bcd.efg-h

El dígito posterior al guión (h) es también llamado dígito verificador.

Para obtener h debemos:

Multiplicar a,b,c,d,e,f,g por las siguientes constantes: (a; b; c; d; e; f; g) .* (2; 9; 8; 7; 6; 3; 4)El resultado de la suma s = 2*a + 9*b + 8*c + 7*d + 6*e + 3*f + 4*g es dividido por 10 quedándonos con resto (M = s modulo 10)Finalmente h = (10 – M) % 10

Ejemplo practico:Si la CI es 1.234.567:

s = 2*1 + 9*2 + 8*3 + 7*4 + 6*5 + 3*6 + 4*7 = 148M = 148 % 10 = 8h = (10 – 8) % 10 = 2Obteniendo que 1.234.567-2 es un número de CI valido.

Desde ya agradezco su respuesta y su ayuda en dicho problema para poder encontrar un script o formula para resolverlo

Hace un tiempo hice esta función para verificar si un string era una cédula valida

public static bool IsValidaCedula(string cedula){ const string expression = @"(\d)\.(\d)(\d)(\d)\.(\d)(\d)(\d)-(\d)";

Regex r = new Regex(expression, RegexOptions.IgnoreCase | RegexOptions.Compiled); Match m = r.Match(cedula); if (!m.Success) { return false; } int[] vector = { 2, 9, 8, 7, 6, 3, 4 }; int digito = 0; for (int i = 0; i < 7; i++) digito += int.Parse(m.Groups[i + 1].ToString()) * vector[i]; digito = 10 - (digito % 10); return int.Parse(m.Groups[8].ToString()) == digito;}

Public Function DigitoVerificador(m As Variant, Optional tick As Control) As IntegerDim xCedula As String, xPatron As String

Page 3: Famoso Algoritmo de La CI Uruguaya

Dim Numero As Integer, x As Integer, Resto As IntegerConst Patron = "2987634"n = Left(m, 7) Numero = 0 'Se multiplica la cédula desde atrás hacia adelante 'con el número patrón For x = Len(n) To 1 Step -1 xCedula = Val(Mid(n, x, 1)) xPatron = Val(Mid(Patron, x, 1)) Numero = Numero + xPatron * xCedula Next 'Se calcula el Resto a 10 Resto = Numero Mod 10 'Se calcula el dígito verificador If Resto > 0 Then DigitoVerificador = 10 - Resto If DigitoVerificador = Right(m, 1) Then tick.Visible = True Else Call MsgBox("Número de cédula incorrecto. Por favor verifique", vbExclamation Or vbSystemModal, App.Title) tick.Visible = False End If Else DigitoVerificador = Resto If DigitoVerificador = Right(m, 1) Then tick.Visible = True Else Call MsgBox("Número de cédula incorrecto. Por favor verifique", vbExclamation Or vbSystemModal, App.Title) tick.Visible = False End If End If

End Function

Algoritmo en JavaScript para validar el Documento de identidad UruguayoPublicado por: nprieto23 en: diciembre 27, 2011

En: Programación y Testing | Tecnología 13 Comentarios

En primer lugar para los que no lo saben y les interesa saber cual es la lógica atrás del numero de cédula uruguayo les paso a comentar:

Cálculo del Dígito Verificador

Page 4: Famoso Algoritmo de La CI Uruguaya

Se toman los 7 números de la cédula y se multiplican cada uno por 2987634 uno a uno el primer número por el 2, el segundo por el 9 y así sucesivamente, cuando cada resultado supera un dígito, se toma sólo la unidad.

Ej.:C.I.: 1.234.567-X -> 2987634 -> 2, 8, 4, 8, 0, 8, 8Se hace la sumatoria de los resultados, en el ejemplo sería 2+8+4+8+0+8+8=38.Se busca el primer número más grande que 38 que termina en cero y se le resta: 40-38= 2, (es lo mismo que 10-(38 mod 10)).Es x=2 pues, el dígito verificador para la cédula 1.234.567.

Otra manera más simple de verlo es como un producto escalar de vectores en módulo 10. Las primeras 7 cifras de la cédula pueden verse como un vector de largo 7.Ese vector es multiplicado escalarmente por el vector 8123476 obteniéndose un número N.El dígito verificador resulta ser N módulo 10.

Ej.: C.I.: 1.234.567-X -> X = [(1x8)+(2x1)+(3x2)+(4x3)+(5x4)+(6x7)+(7x6)] mod 10 -> X = [8+2+6+12+20+42+42] mod 10 = 132 mod 10 = 2

vía Documento de identidad – Wikipedia, la enciclopedia libre.

A continuación el algoritmo en javascript para validar una cédula uruguaya, lo adapté de uno que encontré hecho en Java, se considera que ´ci´ es un parámetro que contiene un número de cédula sin puntos ni guiones, esas validaciones deben hacerlas antes de llamar a esta función o bien agregarselas a la función:

function validarCedula(ci){//Inicializo los coefcientes en el orden correctovar arrCoefs = [2,9,8,7,6,3,4,1];var suma = 0;//Para el caso en el que la CI tiene menos de 8 digitos//calculo cuantos coeficientes no voy a usarvar difCoef = parseInt(arrCoefs.length – ci.length);//recorro cada digito empezando por el de más a la derecha//o sea, el digito verificador, el que tiene indice mayor en el arrayfor (var i = ci.length – 1; i > -1; i–) {//Obtengo el digito correspondiente de la ci recibidavar dig = ci.substring(i, i+1);//Lo tenía como caracter, lo transformo a int para poder operarvar digInt = parseInt(dig);//Obtengo el coeficiente correspondiente al ésta posición del digitovar coef = arrCoefs[i+difCoef];//Multiplico dígito por coeficiente y lo acumulo a la suma totalsuma = suma + digInt * coef;}// si la suma es múltiplo de 10 es una ci válidaif ( (suma % 10) == 0 ) {

Page 5: Famoso Algoritmo de La CI Uruguaya

return true;} else {return false;}}

Cálculo del DÃgito Verificador'

Se toman los 7 números de la cédula y se multiplican cada uno por 2987634 uno a uno (el primer número por el 2, el segundo por el 9 y asà sucesivamente, cuando cada resultado supera un dÃgito, se toma sólo la unidad).

Ej.:

C.I.: 1.234.567-X -> 2987634 -> 2, 8, 4, 8, 0, 8, 8

Se hace la sumatoria de los resultados, en el ejemplo serÃa 2+8+4+8+0+8+8=38 Se busca el primer número más grande que 38 que termina en 0 y se le resta: 40-38= 2 (es lo mismo que 10-(38 mod 10)). Es x=2 pues, el dÃgito verificador para la cédula 1.234.567.

Otra manera más simple de verlo es como un producto escalar de vectores en módulo 10. Las primeras 7 cifras de la cédula pueden verse como un vector de largo 7. Ese vector es multiplicado escalarmente por el vector 8123476 obteniéndose un número N. El dÃgito verificador resulta ser N módulo 10.

Ej.: C.I.: 1.234.567-X -> X = [(1x8)+(2x1)+(3x2)+(4x3)+(5x4)+(6x7)+(7x6)] mod 10 -> X = [8+2+6+12+20+42+42] mod 10 = 132 mod 10 = 2

Codigo clipper para el calculo del digito verificador

*--------------------------------------------------------------------------------* ** ?chkdig( 3139951 ) // resultado 5 ** *clear screenced = 0@5,5 get cedread? chkdig( ced )

function Chkdig( nDocid )

local chd1local t1,t2local a1,a2,a3,a4,a5,a6,a7local b1,b2,b3,b4,b5,b6,b7

a1 := int(nDocid/1000000)a2 := int(nDocid/100000)-(a1*10)a3 := int(nDocid/10000)-(a1*100+a2*10)a4 := int(nDocid/1000)-(a1*1000+a2*100+a3*10)a5 := int(nDocid/100)-(a1*10000+a2*1000+a3*100+a4*10)a6 := int(nDocid/10)-(a1*100000+a2*10000+a3*1000+a4*100+a5*10)

Page 6: Famoso Algoritmo de La CI Uruguaya

a7 := int(nDocid/1)-(a1*1000000+a2*100000+a3*10000+a4*1000+a5*100+a6*10)b1 := mod(a1*2,10)b2 := mod(a2*9,10)b3 := mod(a3*8,10)b4 := mod(a4*7,10)b5 := mod(a5*6,10)b6 := mod(a6*3,10)b7 := mod(a7*4,10)t1 := b1+b2+b3+b4+b5+b6+b7t2 := mod(t1,10)

chd1 := abs(t2-10)chd1 := mod(chd1,10)

return int(chd1)

*--------------------------------------------------------------------------------