Skip to content

Instantly share code, notes, and snippets.

@linuxgemini
Last active January 22, 2021 08:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save linuxgemini/dc2d86af970d7cd2ad3271cb2c790025 to your computer and use it in GitHub Desktop.
Save linuxgemini/dc2d86af970d7cd2ad3271cb2c790025 to your computer and use it in GitHub Desktop.
A single file Python module for Turkish ID numbers based around the work of github.com/ssg/TurkishId
"""tckn
A simple Python library for handling Turkish ID Numbers.
"""
# Copyright 2021 İlteriş Yağıztegin Eroğlu (linuxgemini)
# SPDX-License-Identifier: MIT
import secrets
from typing import List
__secure_rng = secrets.SystemRandom()
__all__ = [
"verifyTCKN",
"generateTCKN"
]
def __is_int(n) -> bool:
try:
int(n)
return True
except ValueError:
return False
def __sum_digits(n: int) -> int:
s = 0
while n:
s += n % 10
n //= 10
return s
def __generate_tckn_from_seed(seed: int) -> str:
d1 = seed // 100_000_000
d2 = (seed // 10_000_000) % 10
d3 = (seed // 1_000_000) % 10
d4 = (seed // 100_000) % 10
d5 = (seed // 10_000) % 10
d6 = (seed // 1000) % 10
d7 = (seed // 100) % 10
d8 = (seed // 10) % 10
d9 = seed % 10
oddSum = d1 + d3 + d5 + d7 + d9
evenSum = d2 + d4 + d6 + d8
n = (oddSum * 7) - evenSum
if n < 0:
n = n + 10
d10 = n % 10
d11 = (oddSum + evenSum + d10) % 10
return f"{seed}{d10}{d11}"
def verifyTCKN(tckn: str) -> bool:
if not isinstance(tckn, str):
raise ValueError("tckn is not a str")
if len(tckn) != 11:
raise ValueError("tckn is not 11 digits")
if not __is_int(tckn):
raise ValueError("tckn contains non-digit chars")
d1 = int(tckn[0])
d2 = int(tckn[1])
d3 = int(tckn[2])
d4 = int(tckn[3])
d5 = int(tckn[4])
d6 = int(tckn[5])
d7 = int(tckn[6])
d8 = int(tckn[7])
d9 = int(tckn[8])
d10 = int(tckn[9])
d11 = int(tckn[10])
if d1 <= 0:
return False
n = ((d1 + d3 + d5 + d7 + d9) * 7) - (d2 + d4 + d6 + d8)
if n < 10:
n = n + 10
d10calc = n % 10
d11calc = __sum_digits(int(f"{tckn[:9]}{d10calc}")) % 10
return (d10 == d10calc) and (d11 == d11calc)
def generateTCKN(amount: int = 1) -> List[str]:
if not isinstance(amount, int):
raise ValueError("amount is not an int")
final = []
for _ in range(amount):
rnd = __secure_rng.randrange(100_000_000, 1_000_000_000)
final.append(__generate_tckn_from_seed(rnd))
return final
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment