zl程序教程

您现在的位置是:首页 >  Python

当前栏目

生成UUID论英雄:Python、MySQL和Power BI谁强?

2023-04-18 14:50:45 时间

我们在实际编程过程中会经常遇到需要用唯一ID的场合,这些唯一ID还会存到数据库中以便于我们将来进行查询和匹配。

例如用户编号、订单编号、客户编号等等,几乎凡是需要用来严格划分用户数据归属性的地方就需要用到唯一ID,否则A的数据到了B那,数据乱了整个系统也就算是毁了。

那么唯一ID该如何有效的生成就变成了一门学问了。

其实最简单的办法就是从1开始,逐行检验重复值,如果是新的值,就+1,不断循环,但是这办法显然十分低能。

国际上对于ID标准化、唯一化有一些统一的标准,比如:

UUID全称:Universally Unique Identifier,即通用唯一识别码。是一个由4个连字号(-)将32个字节长的字符串分隔后生成的字符串,总共36个字节长。比如:d656baaf-42d6-4422-8df8-aa544058ec93。 目前最广泛应用的UUID,是微软公司的全局唯一标识符(GUID),而其他重要的应用,则有Linux ext2/ext3文件系统、LULS加密分区、GNOME、KDE、Mac OS X等等。

既然是“通用的”识别码,那么在不同的语言中,如何生成UUID呢?

Python

有专门生成uuid的库:uuid

import uuid
uid=uuid.uuid1()
print(uid)

用的是uuid1方法生成,默认会生成一个带减号(-)的字符串,我们可以通过hex拿到不带减号的版本,可以根据实际情况使用。

那么什么是uuid1呢?我们来看看Python关于UUID的源码。

从源码注释里得知,uuid1这个方法主要是根据当前机器ID,一个随机序列号和时间戳生成的一个随机字符串。

当然,使用过mongodb的朋友们很清楚,它的文档默认的key其实也是一个uuid,所以我们也可以利用mongodb的ObjectId来产生一个UUID。

在python中有个bson包,BSON是一种计算机数据交换格式,主要被用作MongoDB数据库中的数据存储和网络传输格式。

代码直接生成:

import bson
demoid = bson.ObjectId()
print(demoid)

结果:

MySQL

在MySQL中,我们可以用uuid()函数来生成一个UUID,如下图:

默认生成的uuid含有'-',我们可以使用replace函数替换掉'-'。当然,也是视具体情况而定,SQL如下:

select replace(uuid(),"-","") as uuid;

结果:

Power BI

那么在Power BI中我们如何生成UUID呢?

在微软的整个体系中,UUID的标准是GUID。

GUID 是 Globally Unique IDentifier 的首字母缩写。简而言之,GUID 是一个十六进制数,相当于一个包含 39 位数字的十进制数 – 类似于 1,000,000,000,000,000,000,000,000,000,000,000,000,000,000(十二进制)。换句话说,GUID 是一个高度唯一的 ID,即使它是随机生成的,也不太可能重现(基于概率) - 确实如此,且与UUID一致。

在DAX中并没有这样一个生成GUID的函数:

尝试在power query中寻找:

Guid.From函数是将文本的不带“-”的guid变成带“-”的标准化guid:

这显然不是我们想要的。

而Text.NewGuid是直接生成一个新的GUID:

直接对其进行调用:

比如我们要在Power BI中对一个姓名表生成不同的UUID,以下为姓名表:

我想为每一个NAME随机生成一个UUID,那么先对列去重,然后添加一行:

= Table.AddColumn(删除的副本, "自定义", each Text.NewGuid())

结果发现:

所有的行都是相同的值,这显然不是我们想要的。

而且,如果我们仔细审视这张图,深入思考,就会发现,Text.NewGuid只运行了一次!对于所有的行,Text.NewGuid只运行了一次!

也就是说,在添加自定义列时,pq并不是循环每一行来实现添加,而是直接一次性添加!