我在python中有许多变量,我想用它们为这些变量生成一个唯一的ID(但是这个ID总是为那些相同的匹配变量生成)。
我已使用.encode('hex','strict')
生成似乎的ID,但输出值非常长。有没有办法使用变量生成更短的 ID?
myname = 'Midavalo'
mydate = '5 July 2017'
mytime = '8:19am'
codec = 'hex'
print "{}{}{}".format(myname, mydate, mytime).encode(codec,'strict')
此输出
4d69646176616c6f35204a756c792032303137383a3139616d
我意识到hex
它可能取决于三个变量的长度,所以我想知道是否有另一个编解码器可以/将产生更短的值而不排除任何变量?
到目前为止,我已经对来自7.8.4. Python Specific Encodings的base64
,bz2
,hex
,quopri
,uu
,zip
进行了测试,但是我不确定如何在不删除变量的情况下获得更短的值。
是否有我可以使用的其他编解码器,或者是一种在不删除唯一性的情况下缩短其中任何值的方法,或者甚至是完全不同的方式来生成我需要的?
我要做的就是生成一个ID,以便在将它们加载到数据库时识别这些行。如果已存在相同的值,则不会在数据库中创建新行。没有安全要求,只有一个唯一的ID。这些值在别处生成到python中,所以我不能只为这些值使用数据库发布的ID。
答案 0 :(得分:2)
你可以使用hashlib包中的一些散列算法:https://docs.python.org/3/library/hashlib.html或者python 2:https://docs.python.org/2.7/library/hashlib.html
import hashlib
s = "some string"
hash = hashlib.sha1(str.encode(s)).hexdigest() # you need to encode the strings into bytes here
对于相同的字符串,此哈希值相同。 您选择的算法取决于您想要的字符数和冲突风险(两个不同的字符串产生相同的哈希)。
答案 1 :(得分:0)
如果您不特定于哈希,而只想基于两个或多个字符串的 uniq 值。它连接每个字符串的第一个字符并输出一个 uniq 值
#prints HKRC1LB for two string1 and string2
#Concatenate first char of all strings to get a uniq id
def get_uniq_val(*args):
id = ""
for i in args:
for j in i.split():
id += j[0]
return id
def main():
string_1 = "Howard Kid Recreation Centre"
string_2 = "150 Lantern Blvd"
uid = get_uniq_val(string_1,string_2)
print(uid)
if __name__ == "__main__":
main()