一、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.csdn.net/yl416306434/article/details/80569688
https://docs.python.org/zh-cn/3/library/uuid.html