1. 当前位置:网站首页 > Python

分布式唯一id的4种解决方案


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)

示例


本文最后更新于2022-7-5,已超过 3个月没有更新,如果文章内容或图片资源失效,请留言反馈,我们会及时处理,谢谢!
版权说明

本文地址:http://www.liuyangdeboke.cn/?post=22
未标注转载均为本站远程,转载请注明文章出处:

发表评论

联系我们

在线咨询:点击这里给我发消息

微信号:17721538135

工作日:9:00-23:00,节假日休息

扫码关注