根据 Python 中的其他值创建一个简短的唯一 ID?

Creating a short unique ID based on other values in Python?

我在 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 它可能取决于三个变量的长度,所以我想知道是否有另一个编解码器 can/will 产生较短的值而不排除任何变量?

到目前为止,我已经从 7.8.4. Python Specific Encodings 测试了 base64bz2hexquopriuuzip ],但我不确定如何在不删除变量的情况下让其中任何一个生成更短的值。

是否有我可以使用的另一种编解码器,或者有一种方法可以在不消除唯一性的情况下缩短其中任何一个的值,或者甚至是一种完全不同的方法来产生我需要的东西?

我想做的就是生成一个 ID,这样我就可以在将这些行加载到数据库中时识别它们。如果相同的值已经存在,则不会在数据库中创建新行。没有安全要求,只有一个唯一的 ID。这些值是在其他地方生成的 python,所以我不能只为这些值使用数据库发布的 ID。

您可以使用 hashlib 包中的一些哈希算法:https://docs.python.org/3/library/hashlib.html or for 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

对于相同的字符串,此哈希值是相同的。 您选择的算法取决于您想要的字符数和冲突风险(两个不同的字符串产生相同的哈希值)。

如果您不特定于散列,而只是想要基于两个或多个字符串的唯一值。它连接每个字符串的第一个字符并输出一个唯一值

#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()