一、uuid去横杠的原因
最近在使用jumpserver跳板机调用开发项目。jumpserver很多数据库主键是使用的uuid,去除横杠的uuid。
找了下资料,原因如下:
数据库中直接存储UUID的坏处:
完全‘随机’的字符串,例如由MD5()、SHA1()、UUID()产生的。它们产生的每一个新值都会被任意地保存在很大的空间范围内,这会减慢INSERT及一些SELECT查询。
1)它们会减慢INSERT查询,因为插入的值会被随机地放入索引中。这会导致分页、随机磁盘访问及聚集存储引擎上的聚集索引碎片。
2)它们会减慢SELECT查询,因为逻辑上相邻的行会分布在磁盘和内存中的各个地方。
3)随机值导致缓存对所有类型的查询性能都很差,因为它们会使缓存赖以工作的访问局部性失效。如果整个数据集都变得同样“热”的时候,那么把特定部分的数据缓存到内存中就没有任何的优势了。并且如果工作集不能被装入内存中,缓存就会进行很多刷写的工作,并且会导致很多缓存未命中。
如果保存UUID值,就应该移除其中的短横线。
所以,mysql 如果保存UUID值,就应该移除其中的短横线。
二、uuid 去横杠 和 有效uuid字符串转为uuid 实现
python 中实现简单,字符串替换、split列表 拼接等方法都可以处理。
s = str(uuid.uuid4())
>>> s.replace('-', '')
'b9bd0bb7f60c4738a9f51b458d5e2add'
>>> ''.join(s.split('-'))
'b9bd0bb7f60c4738a9f51b458d5e2add'
然后jumpserver 接口调用 过程中,接口中的 uuid主键部分又是有横杠的。这就需要把有效的uuid字符串添加横杠转成uuid。再加上如上去横杠实现非原生,感觉不友好,于是找资料一并解决下。
1、uuid 去横杠
>>> uuid.uuid4().hex
'3f266e6f99f944c28bb8e64a1bac7a4d'
2、有效uuid字符串添加横杠转为uuid
>>> uuid.UUID('3f266e6f99f944c28bb8e64a1bac7a4d')
UUID('3f266e6f-99f9-44c2-8bb8-e64a1bac7a4d')
uuid 说明:
-
uuid1()
:这个是根据当前的时间戳和MAC地址生成的,最后的12个字符408d5c985711对应的就是MAC地址,因为是MAC地址,那么唯一性应该不用说了。但是生成后暴露了MAC地址这就很不好了。 -
uuid3()
:里面的namespace和具体的字符串都是我们指定的,然后呢···应该是通过MD5生成的,这个我们也很少用到,莫名其妙的感觉。 -
uuid4()
:这是基于随机数的uuid,既然是随机就有可能真的遇到相同的,但这就像中奖似的,几率超小,因为是随机而且使用还方便,所以使用这个的还是比较多的。 -
uuid5()
:这个看起来和uuid3()貌似并没有什么不同,写法一样,也是由用户来指定namespace和字符串,不过这里用的散列并不是MD5,而是SHA1.
以下是该uuid模块典型用法的一些示例:
>>> import uuid
>>> # make a UUID based on the host ID and current time
>>> uuid.uuid1()
UUID('a8098c1a-f86e-11da-bd1a-00112444be1e')
>>> # make a UUID using an MD5 hash of a namespace UUID and a name
>>> uuid.uuid3(uuid.NAMESPACE_DNS, 'python.org')
UUID('6fa459ea-ee8a-3ca4-894e-db77e160355e')
>>> # make a random UUID
>>> uuid.uuid4()
UUID('16fd2706-8baf-433b-82eb-8c7fada847da')
>>> # make a UUID using a SHA-1 hash of a namespace UUID and a name
>>> uuid.uuid5(uuid.NAMESPACE_DNS, 'python.org')
UUID('886313e1-3b8a-5372-9b90-0c9aee199e5d')
>>> # make a UUID from a string of hex digits (braces and hyphens ignored)
>>> x = uuid.UUID('{00010203-0405-0607-0809-0a0b0c0d0e0f}')
>>> # convert a UUID to a string of hex digits in standard form
>>> str(x)
'00010203-0405-0607-0809-0a0b0c0d0e0f'
>>> # get the raw 16 bytes of the UUID
>>> x.bytes
b'\x00\x01\x02\x03\x04\x05\x06\x07\x08\t\n\x0b\x0c\r\x0e\x0f'
>>> # make a UUID from a 16-byte string
>>> uuid.UUID(bytes=x.bytes)
UUID('00010203-0405-0607-0809-0a0b0c0d0e0f')
参考资料:
https://www.jb51.net/article/60790.htm
https://blog.youkuaiyun.com/yl416306434/article/details/80569688
https://docs.python.org/zh-cn/3/library/uuid.html