since @likeadoc did not keep his word in releasing the serialnumber generator, here the code i sent him (most of the sns will be valid):
from random import randrange
def get_digit(number, n):
return number // 10 ** n % 10
def get_cross_sum(number):
return sum([int(i) for i in str(number)])
def get_serial_number(model):
"""
Generate a serial for the given model
:param model: The model shall be between 0 and 1 for 0=DS3615 and 1=DS3617
:return: The serial as string
"""
model_type = ['LWN', 'ODN']
lwn = range(1640, 1691, 10)
odn = [1690] + range(1710, 1791, 10) + range(1810, 1891, 10)
model_range = [lwn, odn]
model_sn_count = 10
bbb_range = range(000, 901, 100)
xyz_range = model_range[model]
xyz = xyz_range[randrange(len(xyz_range))]
bbb = bbb_range[randrange(len(bbb_range))]
element_at = randrange(model_sn_count) # Every block contains 25 serialnumbers
digit_x = get_digit(xyz, 3)
digit_y = get_digit(xyz, 2)
digit_z = get_digit(xyz, 1)
aaa = (10 - digit_z + get_cross_sum(bbb)) % 10
increment = [digit_x * 10 + digit_y] if (digit_y + digit_z) <= 10 else [digit_x * 10, digit_y]
result = aaa
for i in range(1, element_at):
result = result + increment[(i + 1) % len(increment)]
result = "%d%s%03d%03d" % (xyz, model_type[model], result, bbb)
return result
if __name__ == '__main__':
print "1: DS3615xs"
print "2: DS3617xs"
input_value = None
while input_value is None:
input_value = raw_input("Which model (1,2): ")
if input_value == "1" or input_value == "2":
break
input_value = None
model = int(input_value) - 1
serial_number = get_serial_number(model)
print "SerialNumber: " + serial_number
# Algorithm:
# SerialNumber is divided by -> XYZ ODN AAA BBB.
# ODN is the model specific code
# every XYZ/BBB block contains an unknown number of serialnumber and can be 5 or 25, but not too many
# AAA = (10 - (Z) + cross_sum(BBB)) modulo 10
# BBB = constant value between 000 - 900 in 100 steps
# next value for AAA -> previous value + Offset
#
# Offset is defined by:
# Y + Z <= 10, the offset is +XY, otherwise its alternated +(X*10), +Y