创建算法以生成20位数代码

时间:2015-04-09 02:48:40

标签: python algorithm

我想创建一个创建20位数字代码的算法。与礼品卡代码的创建方式类似。我想使用python,因为我知道python是所有编程语言中最好的。我希望它能根据某些规则创建数字(例如,如某些礼品卡必须以S开头并且必须有X个字母和数字)我不知道我是否清楚地解释了这一点,但基本上我想要的是创建一个算法,它将创建一个具有某些规则的20位数代码,这样人们就无法创建" false"码。谢谢! :)

我目前的代码是

import random

def random_with_N_digits(n):
    range_start = 10**(n-1)
    range_end = (10**n)-1
    return randint(range_start, range_end)

print random_with_N_digits(20)

但是我一直在打印声明上出错?

2 个答案:

答案 0 :(得分:1)

算法基本上是一组完成某些事情的规则,启动它就像启动任何一段代码一样。 由于您的问题缺少一些数据,我将假设您要随机选择一个字母或数字。

算法需要一个字母和数字列表,并且只是说明:对于1-20范围内的每个数字,你想要“运行”一套规则。

您要运行的这组规则只不过是一个函数或一些可以从数据列表中随机选择字母/数字的代码。

上面的代码将为您建立一个数字和字母的数据列表,您可以随机选择算法。

import string
from random import randint
data = list(string.ascii_lowercase)
[data.append(n) for n in range(0, 10)]

以下代码的范围为0到21(1,20),并根据数据列表中随机选择的数字或字母生成20个字符的字符串

x = [str(data[randint(0, len(data)-1)]) for n in range(0, 21)]
y = ''.join(x)
print y
>>> 'km1o07fy9t3j0dktabjsg'

答案 1 :(得分:0)

执行此操作的一种方法是将序号映射到20位代码。也就是说,从数字1开始,然后将其映射到"代码"那可能是" 1791AQFZ537Y"。数字2将映射到,例如," 3894KJAC624H"等。

您将问题分成两部分。首先,您需要采用序列号并使其不连续。你可以使用multiplicative inverse来做到这一点。正如文章中指出的那样,任何两个连续值看起来都有很大不同。

但是,你所拥有的只是一个数字。假设使用上面的函数,1转为973840256539.并且您想将其转换为具有字母和数字的代码。假设您想要三个字母后跟四个数字等等。

取原始数字,除以26并保存。剩余部分将在0-25范围内。那是你的第一个角色(0 = A,1 = B等)对于其他两个字母再做两次,每次分割时都保存这个值。然后通过做同样的事情四次生成数字,但使用10作为除数。

你当然必须摆弄编码以使其符合你的特定规则,但我所描述的应该给你基本的想法。

生成的代码将具有您想要的格式,并且它也是可逆的。您可以获取代码,执行与编码过程相反的操作以获取数字,然后使用乘法反转来返回原始序列号。

因此,如果有人编写代码,您可以快速对其进行反向工程以找到它对应的原始编号。假设您解码了一个值,它会产生值137894,但您用来生成代码的最高序列号是50000.您立即知道该代码无效。

这种技术并不新鲜。 YouTube似乎使用非常相似的内容来创建视频密钥。例如,YouTube视频密钥" tCjzSaP0XFE"是base64编码的长(64位)整数。但它解码的数字不是真正的键。真正的密钥是序号。创建视频时,他们使用下一个顺序键,使用乘法逆转换它,然后base64编码结果以提供已发布的密钥。