T.C. Kimlik No Algoritması

Rom.

Rektör
Emektar
Katılım
11 Aralık 2008
Mesajlar
15,332
Reaksiyon puanı
177
Puanları
243
Bir müşteriden inatla gelen doğrulama isteği üzerine T.C. kimlik no'sunun rakamsal olarak "kesinlikle" doğru olmadan formun validate etmemesi için ufak bir araştıma sonucunda şunu buldum.
TC Kimlik numaraları 11 basamaktan oluşmaktadır. İlk 9 basamak arasında kurulan bir algoritma bize 10. basmağı, ilk 10 basamak arasında kurulan algoritma ise bize 11. basamağı verir.
* 11 hanelidir.
* Her hanesi rakamsal değer içerir.
* İlk hane 0 olamaz.
* 1. 3. 5. 7. ve 9. hanelerin toplamının 7 katından, 2. 4. 6. ve 8. hanelerin toplamı çıkartıldığında, elde edilen sonucun 10'a bölümünden kalan, yani Mod10'u bize 10. haneyi verir.
* 1. 2. 3. 4. 5. 6. 7. 8. 9. ve 10. hanelerin toplamından elde edilen sonucun 10'a bölümünden kalan, yani Mod10'u bize 11. haneyi verir.

Kaynak


C#
Kod:
public static bool TcDogrulaV2(string tcKimlikNo)
{
    bool returnvalue = false;
    if (tcKimlikNo.Length == 11)
    {
        Int64 ATCNO, BTCNO, TcNo;
        long C1,C2,C3, C4, C5,C6,C7,C8, C9,Q1,Q2;


        TcNo = Int64.Parse(tcKimlikNo);


        ATCNO = TcNo / 100;
        BTCNO = TcNo / 100;


         C1 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C2 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C3 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C4 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C5 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C6 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C7 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C8 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         C9 = ATCNO % 10;  ATCNO = ATCNO / 10 ;
         Q1 = ((10-((((C1+C3+C5+C7+C9)*3)+(C2+C4+C6+C8))%10))%10);
         Q2 = ((10-(((((C2+C4+C6+C8)+Q1)*3)+(C1+C3+C5+C7+C9))%10))%10);


         returnvalue = ((BTCNO * 100)+(Q1 * 10)+Q2 == TcNo);
    }
    return returnvalue;
}

VB

Kod:
Public Shared Function TcDogrulaV2(ByVal tcKimlikNo As String) As Boolean
     Dim returnvalue As Boolean = False
     If (tcKimlikNo.Length <> 11) Then
         Return returnvalue
     End If
     Dim TcNo As Long = Long.Parse(tcKimlikNo)
     Dim ATCNO As Long = (TcNo / 100)
     Dim BTCNO As Long = (TcNo / 100)
     Dim C1 As Long = (ATCNO Mod 10)
     ATCNO = (ATCNO / 10)
     Dim C2 As Long = (ATCNO Mod 10)
     ATCNO = (ATCNO / 10)
     Dim C3 As Long = (ATCNO Mod 10)
     ATCNO = (ATCNO / 10)
     Dim C4 As Long = (ATCNO Mod 10)
     ATCNO = (ATCNO / 10)
     Dim C5 As Long = (ATCNO Mod 10)
     ATCNO = (ATCNO / 10)
     Dim C6 As Long = (ATCNO Mod 10)
     ATCNO = (ATCNO / 10)
     Dim C7 As Long = (ATCNO Mod 10)
     ATCNO = (ATCNO / 10)
     Dim C8 As Long = (ATCNO Mod 10)
     ATCNO = (ATCNO / 10)
     Dim C9 As Long = (ATCNO Mod 10)
     ATCNO = (ATCNO / 10)
     Dim Q1 As Long =((10-(((((((C1+C3)+C5)+C7)+C9)*3)+(((C2+C4)+C6)+C8))Mod 10))Mod 10)
     Dim Q2 As Long =((10-(((((((C2+C4)+C6)+C8)+Q1)*3)+((((C1+C3)+C5)+C7)+C9))Mod 10))Mod 10)
     Return ((((BTCNO * 100) + (Q1 * 10)) + Q2) = TcNo)
End Function

C# Tc Kimlik No Algoritma Doğrulama

JavaScript

Kod:
function check_tcno(a){
  if(a.substr(0,1)==0&&a.lenght!=11){
    return false;
  }
  var i = 9, md='', mc='', digit, mr='';
  while(digit = a.charAt(--i)){
    i%2==0 ? md += digit : mc += digit;
  }
  if(((eval(md.split('').join('+'))*7)-eval(mc.split('').join('+')))%10!=parseInt(a.substr(9,1),10)){
    return false;
  }
  for (c=0;c<=9;c++){
    mr += a.charAt(c);
  }
  if(eval(mr.split('').join('+'))%10!=parseInt(a.substr(10,1),10)){
    return false;
  }
  return true;
}

PHP+RegExp

Kod:
function check_tcno($tcno) {
   preg_replace('/([1-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1})([0-9]{1}).*$/e', "eval('\$on=((((\\1+\\3+\\5+\\7+\\9)*7)-(\\2+\\4+\\6+\\8))%10); \$onbir=(\\1+\\2+\\3+\\4+\\5+\\6+\\7+\\8+\\9+\$on)%10; \$sonIki = \$on.\$onbir;')", $tcno);
   return(substr($tcno, -2) == $sonIki);
}

VB kodlarını kullanmak istedim ancak rakamları string olarak algılamak gibi garip bir hata ile karşılaştım. zaten yukarıda alıntı olarak belirttiğim doğrulama kurallarından farklı hata mesajları almak istediğimden VB kod üzerinde oynamalar yaparak şu hale getirdim. TcDogrulaV2 ve isNumeric (js) fonksiyonlarını kullanarak olumlu sonuç almış bulunmaktayım.

Kod:
Function TcDogrulaV2(ByVal tcKimlikNo As String) As Boolean
        Dim returnvalue As Boolean = False
        If (tcKimlikNo.Length <> 11) Then
            tcCustom.ErrorMessage = "<br />TC Kimlik Numarası 11 Haneli Olmalıdır."
            Return returnvalue
        End If
        Dim TcNo As Long = Long.Parse(tcKimlikNo)
        Dim BTCNO As Long = Long.Parse(Left(tcKimlikNo, 9))
        
        Dim C1 As Long = Long.Parse(Mid(tcKimlikNo, 1, 1))
        Dim C2 As Long = Long.Parse(Mid(tcKimlikNo, 2, 1))
        Dim C3 As Long = Long.Parse(Mid(tcKimlikNo, 3, 1))
        Dim C4 As Long = Long.Parse(Mid(tcKimlikNo, 4, 1))
        Dim C5 As Long = Long.Parse(Mid(tcKimlikNo, 5, 1))
        Dim C6 As Long = Long.Parse(Mid(tcKimlikNo, 6, 1))
        Dim C7 As Long = Long.Parse(Mid(tcKimlikNo, 7, 1))
        Dim C8 As Long = Long.Parse(Mid(tcKimlikNo, 8, 1))
        Dim C9 As Long = Long.Parse(Mid(tcKimlikNo, 9, 1))
        
        Dim Q1 As Long = ((10 - (((((((C1 + C3) + C5) + C7) + C9) * 3) + (((C2 + C4) + C6) + C8)) Mod 10)) Mod 10)
        Dim Q2 As Long = ((10 - (((((((C2 + C4) + C6) + C8) + Q1) * 3) + ((((C1 + C3) + C5) + C7) + C9)) Mod 10)) Mod 10)
        'Response.Write((((BTCNO * 100) + (Q1 * 10)) + Q2) & " - ")
        'Response.Write(tcKimlikNo)
        If ((((BTCNO * 100) + (Q1 * 10)) + Q2) = TcNo) Then
            tcCustom.ErrorMessage = ""
        Else
            tcCustom.ErrorMessage = "<br />Hatalı TC Kimlik Numarası."
        End If
        
        Return ((((BTCNO * 100) + (Q1 * 10)) + Q2) = TcNo)
    End Function

Arada ismi geçti bari atlamayayım dedim.

Kod:
var isShift=false;
function keyUP(keyCode)
{
      if(keyCode==16) isShift = false;
}


function isNumeric(keyCode)
{
      if(keyCode==16) isShift = true;
      return ((keyCode >= 48 && keyCode <= 57 || keyCode == 8 || (keyCode >= 96 && keyCode <= 105)) && isShift == false);
}

Kaynak
 
Katılım
31 Aralık 2007
Mesajlar
17,485
Reaksiyon puanı
189
Puanları
243
girilen veriyi string olarak algılıyorsa convert classını kullanarak integer'a ya da istediğiniz bir veri tipine çevirebilirsiniz.
 

N3CAT1

Dekan
Emektar
Katılım
20 Nisan 2008
Mesajlar
6,608
Reaksiyon puanı
144
Puanları
243
Güzel konu. Programcıların işlerine yarayacaktır :)
 
Üst