4种唯一id的生成方法:
一、雪花算法 Snowflake
因为雪花算法最后生成出来的其实是一串唯一的数字,而非字符串,适合做数据库索引,看起来非常满足我们的需求,下面就来看看雪花算法在Python中的实现吧。
pip install pysnowflake
启动服务
snowflake_start_server --worker=1
编写程序,获取id
from snowflake import client
print(client.get_guid())
二、UUID
uuid1基于时间戳 由MAC地址、当前时间戳、随机数字。保证全球范围内的唯一性。但是由于MAC地址使用会带来安全问题,局域网内使用IP代替MAC
uuid3基于名字和MD5散列值 通过计算名字和命名空间的MD5散列值得到的,保证了同一命名空间中不同名字的唯一性,不同命名空间的唯一性。但是同一命名空间相同名字生成相同的uuid。
uuid4基于随机数 由伪随机数得到的,有一定重复概率,这个概率是可以算出来的
uuid5基于名字和SAHI值 算法和uuid3相同,不同的是使用SAHI算法
import uuid
class UUIDUtils:
# uuid1: 基于时间戳 由MAC地址、当前时间戳、随机数字
def get_uuid_basedon_timestamps(self):
return str(uuid.uuid1())
# uuid3() 基于名字和MD5散列值 通过计算名字和命名空间的MD5散列值得到的,保证了同一命名空间中不同名字的唯一性,不同命名空间的唯一性。
def get_uuid_basedon_md5(self, name):
return str(uuid.uuid3(uuid.NAMESPACE_DNS, name))
# uuid4随机数的uuid,不推荐使用
def get_uuid_basedon_randomnumber(self):
return str(uuid.uuid4())
# uuid5同样根据传入的namespace和一个由调用者指定字符串生成uuid,如uuid3不同的是,它使用SHA1算法。
def get_uuid_basedon_sha1(self, name):
return str(uuid.uuid5(uuid.NAMESPACE_DNS, name))
t = UUIDUtils()
print(t.get_uuid_basedon_timestamps())
print(t.get_uuid_basedon_md5('test'))
print(t.get_uuid_basedon_randomnumber())
print(t.get_uuid_basedon_sha1('test'))
三、数据库自增ID
默认情况下在数据库每一个表里都有一个名为id的字段,它也被称之为主键ID,它的特点是从1开始,当每新增一条数据,id里的值就会自动加1,因为它的内容是int类型的且数据具有连续性,也适合用来作为索引,看起来我们找到了唯一ID的办法。
但是自增ID的问题在于以下两点:
当数据量太大,比如客户信息一张表的数据超过上千万条时,我们就面临着要分表存储的问题,在多张表的情况下,如何划分自增ID是一个很麻烦的问题。
安全问题,客户端可以根据自增ID很轻易猜出我们的业务数据,按照顺序遍历就是了。
综上所述,自增ID虽然能用,但也不是一个特别好的办法。
四、mongodb的ObjectId
在python里直接使用一个叫bson的第三方包即可,BSON是一种计算机数据交换格式,主要被用作MongoDB数据库中的数据存储和网络传输格式。
import bson
demoid = bson.ObjectId()
print(demoid)
本文地址:http://www.liuyangdeboke.cn/?post=22
未标注转载均为本站远程,转载请注明文章出处:
发表评论