python關於uuid去除橫槓和字符串轉換爲uuid添加橫槓的處理

一、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

發佈了102 篇原創文章 · 獲贊 116 · 訪問量 64萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章