def generate_subject_id(prefix=settings.SUBJECT_LUHN_PREFIX, number_1="", number_2=""): if not number_1 or len(number_1) != 10: number_1 = random_number(10) if not number_2 or len(number_2) != 4: number_2 = random_number(4) number = "%s%s" % (number_1, number_2) prefixed_number = "%s%s" % (prefix, number) luhn_checksum = generate(prefixed_number) return "%s%s" % (number, luhn_checksum)
def create_account(): root_iin_num = "400000" customer_num = str(random.randint(99999999, 999999999)) checksum_digit = luhn.generate(root_iin_num + customer_num) account_num = root_iin_num + customer_num + str(checksum_digit) # generates account number sql_select_query = """select * from card where id = ?""" cur.execute(sql_select_query, (account_num,)) result = cur.fetchone() if result: create_account() else: pin = str(random.randint(999, 9999)) cur.execute("INSERT INTO card (number, pin) VALUES(?, ?)", (account_num, pin)) conn.commit() print("Your card has been created\nYour card number:", account_num, "\nYour card PIN:") print(pin) # select pin from cards dbase
def generate_subject_id(prefix=settings.SUBJECT_LUHN_PREFIX, starts_with="1", number_str_include=""): # Generate a subject according to https://github.com/TransparentHealth/uhi # Supply up to 10 numbers you want in the resulting number. max_allowed_pickable_nums = 10 size_of_between_number = 13 if not number_str_include.isnumeric(): number_str_include = "" # numbers can be any length from 0 - 13 len_numbers = len(number_str_include) if len_numbers > max_allowed_pickable_nums: number_str_include = number_str_include[0:max_allowed_pickable_nums] remaining = size_of_between_number - len(number_str_include) padding = random_number(remaining) number = "%s%s%s" % (starts_with, number_str_include, padding) prefixed_number = "%s%s" % (prefix, number) luhn_checksum = generate(prefixed_number) return "%s%s" % (number, luhn_checksum)
def generate_reference(): """ Return a luhn-valid 10-digit reference like: 123-456 (where 6 is the check digit) """ from . import WriterReaderAllocation characters = '0123456789' for attempt in range(10): five_digits = ''.join(random.choice(characters) for _ in range(5)) reference = '{}-{}{}'.format( five_digits[0:3], five_digits[3:5], luhn.generate(five_digits)) try: WriterReaderAllocation.objects.get(reference=reference) except WriterReaderAllocation.DoesNotExist: return reference raise RuntimeError('Failed repeatedly to generate a unique reference.')
# create directory for salt if not os.path.exists(wd+'/salt'): os.makedirs(wd+'/salt') # store salt for reproducability text_file = open(wd+'\salt\\'+'salt'+salt[:5]+'.txt','w+') text_file.write(salt) text_file.close() # STEP 3: add prefix # define 2 digit prefix for id - should evaluate if len is 2 prefix = input('Define a 1 digit prefix number for id ') idbase['hashedid11'] = str(prefix) + idbase['hashedid9'] # STEP 4 # generate the luhn check digit in new column for visability (will be dropped) idbase['luhn1'] = idbase['hashedid11'].apply(lambda x: luhn.generate(x)) # append the check digit idbase['hashedid12'] = idbase['hashedid11'].apply(lambda x: luhn.append(x)) # test verify idbase['luhnvalid'] = idbase['hashedid12'].apply(lambda x: luhn.verify(x)) # check if any invalid numbers if idbase.luhnvalid.all() == True: print('no issue with check digits') elif idbase.luhnvalid.all() == False: sys.exit('STOP - issue with luhn check digit') # STEP 5: cleanup and strip down # rename new id column idcolname = input('specify column name for new ID... ') idbase.rename(columns={'hashedid12':idcolname},inplace=True) # strip down file
def test_generate(): assert luhn.generate('7992739871') == 3