我们在实际编程过程中会经常遇到需要用唯一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
代码语言:javascript复制import uuid
uid=uuid.uuid1()
print(uid)
用的是uuid1方法生成,默认会生成一个带减号(-)的字符串,我们可以通过hex拿到不带减号的版本,可以根据实际情况使用。
那么什么是uuid1呢?我们来看看Python关于UUID的源码。
从源码注释里得知,uuid1这个方法主要是根据当前机器ID,一个随机序列号和时间戳生成的一个随机字符串。
当然,使用过mongodb的朋友们很清楚,它的文档默认的key其实也是一个uuid,所以我们也可以利用mongodb的ObjectId来产生一个UUID。
在python中有个bson包,BSON是一种计算机数据交换格式,主要被用作MongoDB数据库中的数据存储和网络传输格式。
代码直接生成:
代码语言:javascript复制import bson
demoid = bson.ObjectId()
print(demoid)
结果:
MySQL
在MySQL中,我们可以用uuid()函数来生成一个UUID,如下图:
默认生成的uuid含有'-',我们可以使用replace函数替换掉'-'。当然,也是视具体情况而定,SQL如下:
代码语言:javascript复制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,那么先对列去重,然后添加一行:
代码语言:javascript复制= Table.AddColumn(删除的副本, "自定义", each Text.NewGuid())
结果发现:
所有的行都是相同的值,这显然不是我们想要的。
而且,如果我们仔细审视这张图,深入思考,就会发现,Text.NewGuid只运行了一次!对于所有的行,Text.NewGuid只运行了一次!
也就是说,在添加自定义列时,pq并不是循环每一行来实现添加,而是直接一次性添加!