1. 程式人生 > >[python]利用uuid和base64實現資源主鍵id

[python]利用uuid和base64實現資源主鍵id

不想用mysql的自增id(造資料的時候會很麻煩),而且tiDB也不支援.

而且主鍵希望和資源的業務屬性是可對應的.

比如裝置就是域+ip,這樣如果刪除了再新增,主鍵不會改變.

直接用uuid3,32位元組的字串有點太長,16byte的bytes操作又麻煩, 128bit的int又超過了mysql uint64的限制(拆2位元組太麻煩)

搜尋了一下uuid的壓縮方法,發現base64編碼還是比較靠譜的.

使用base64編碼可以壓縮到22byte, 不過python的base64函式是需要補齊4位的.

檢視文件,還有b85編碼,可以進一步壓到20byte,而且b85encode/b85decode是預設不填充的.

ok,就它了

import uuid
import hashlib

name = 'test_nameqqqwwe1234567890'

#namespace = uuid.NAMESPACE_URL
namespace = uuid.NAMESPACE_DNS

print(uuid.uuid1())
print(uuid.uuid3(namespace,name))
print(uuid.uuid3(namespace,name).int)
print(uuid.uuid3(namespace,name).bytes)
print(uuid.uuid3(namespace,name).hex)
print(uuid.uuid4())
print(uuid.uuid5(namespace,name))
print(hashlib.md5(name.encode(encoding='UTF-8')).hexdigest())

#測試將字串轉為uuid物件
print(uuid.UUID('7e9fc1763b19394a953083391161f8e9'))

#測試用base64來壓縮uuid
import base64

print('test str base64')
def safe_base64_encode(s):
    b = base64.b64encode(s.encode('utf-8'))#因為python3.x中字元都為unicode編碼,而b64encode函式的引數為byte型別,所以必須先轉碼    
    #b= base64.b64encode(s)
    bstr_tmp = str(b,'utf-8') #把byte型別的資料轉換為utf-8的資料    
    print(bstr_tmp)
    b_str= bstr_tmp.strip(r'=+') #用正則把 = 去掉    
    return b_str

def safe_base64_encodebyte(bs):  #b64encode只能接收byte
    #b = base64.b64encode(s.encode('utf-8'))#因為python3.x中字元都為unicode編碼,而b64encode函式的引數為byte型別,所以必須先轉碼    
    b= base64.b64encode(bs)
    bstr_tmp = str(b,'utf-8') #把byte型別的資料轉換為utf-8的資料    
    print(bstr_tmp)
    b_str= bstr_tmp.strip(r'=+') #用正則把 = 去掉    
    return b_str
    
def safe_base64_decode(s):   #b64decode可以接收字串或者byte
    import math
    padlen=math.ceil(len(s)/4)*4
    print(padlen)
    pstr=ten64.ljust(padlen,'=')
    return pstr

s = "binarybstr\x00string"
safe_b = safe_base64_encode(s)
print (safe_b)


print("test base64")
en64=base64.b64encode(uuid.uuid3(namespace,name).bytes)  #b64encode只能接收byte
#en64=base64.b64encode(uuid.uuid3(namespace,name).hex.encode('utf-8'))  #b64encode只能接收byte. 這樣更長了
print(en64)
#trime尾部的=
#ten64=str(en64,'utf-8').strip(r'=+')
ten64=safe_base64_encodebyte(uuid.uuid3(namespace,name).bytes)
print(ten64)
#恢復時補全尾部的=
ren64=safe_base64_decode(ten64)
#ren64=ten64.ljust(24,'=')      #uuid16byte *4/3=22byte,補全為4的倍數24
d64=base64.b64decode(ren64)    #b64decode可以接收字串或者byte
print(d64)


print('test base85')
en85=base64.b85encode(uuid.uuid3(namespace,name).bytes)    #20位,而且不用考慮==
print(en85)
de85=base64.b85decode(en85)
print(de85)
test base85
b'FcW&B=DR*3jUe2byo||5'
b'0\x13z\xa2\xe6\xbb>"\x8d \xdc\x9a\xbc\x8c\xc9G'

不過, b85不是urlsafe的

如果需要在瀏覽器裡面直接用,還是用b64更保險

相關推薦

[python]利用uuidbase64實現資源id

不想用mysql的自增id(造資料的時候會很麻煩),而且tiDB也不支援. 而且主鍵希望和資源的業務屬性是可對應的. 比如裝置就是域+ip,這樣如果刪除了再新增,主鍵不會改變. 直接用uuid3,32位元組的字串有點太長,16byte的bytes操作又麻煩, 128bi

使用UUIDint自增的區別

知其然,知其所以然。在看到生成UUID的程式碼,後帶給我的百度結合自己的經驗再寫下來的區別 一.UUID做主鍵: 優點: 1.保證資料在表和庫都是獨立的,有利於後續的分庫 2.合併表的時候主鍵不會重複 3.有大量資料的時候主鍵不會像int那樣越界 4.有利於處理分散式儲存的資料表   

java實現id自增的表中插入資料

問題 想要向mysql資料庫中插入一條記錄,因為設計的表時自動遞增的,那麼如果插入多條記錄,每次都要設定主鍵的話工作量會很大,而且難免會有重複的主鍵,這時候就要使用強大的主鍵自增的功能了。

python利用Trie(字首樹)實現搜尋引擎中關鍵字輸入提示(學習Hash TrieDouble-array Trie)

python利用Trie(字首樹)實現搜尋引擎中關鍵字輸入提示(學習Hash Trie和Double-array Trie)  主要包括兩部分內容:(1)利用python中的dict實現Trie;(2)按照darts-java的方法做python的實現Double-array Trie比較:(1)

利用FileReaderFormData實現圖片預覽上傳(base64轉二進位制檔案)

業務有個需求,要做圖片預覽上傳,過去都是客戶端上傳給後端,後端返回 url 前端進行預覽,現在其實可以不依賴後端做預覽,最後在上傳,這主要依賴 FileReader 和 FormData 這兩個物件和 JavaScript 處理二進位制的能力。 OK,Show cod

利用SharePrefrenceGson實現實體類的保存與獲取

getclass 類繼承 brush gets static 實現 highlight model htm 實現需要Gson獲者其他能將實體類轉換成json的jar包 接下來是主要方法: 保存實體類 public static void putClass(ModelBa

手機商城第四天,利用GridViewviewpager實現頻道按鈕熱門活動圖片的展示

手機商城第四天 利用gridview和viewpager實現頻道按鈕和熱門活動圖片的展示 代碼已經上傳碼雲,有興趣的小夥伴可以下載看看: https://git.oschina.net/joy_yuan/ShoppingMall 下面是這次的效果圖:其中哪些服飾、遊戲、動漫等欄目

(轉)利用 SVG CSS3 實現有趣的邊框動畫

但是 cin 有一個 orm har arr edi 下載 嘗試 原文地址 今天我們來探索一下Carl Philipe Brenner的網站上一個微妙而有趣的動畫效果。當鼠標經過網格元素時,會有一個微妙的動畫發生——網格元素變得透明,每條邊有個順時針的動畫,創造了非常好的效

利用inotifyrsync實現數據同步

幫助信息 delete 版本 rbo modify 啟用 gre 多個 roo 一.rsync是什麽? 它是Linux系統下文件同步可數據傳輸的工具,采用rsync算法使客戶機與服務器,主服務器與備份服務器數據同步。rsync也能實現中斷後恢復傳輸。rsync支持增量備份。

python利用pandasxlrd讀取excel,特征篩選刪除0值超過99%的列

print div 3.x += nco borde class value append 利用xlrd讀取excel篩選0值超過99%的列,並刪除import xlrdworkbook=xlrd.open_workbook(r"123.xlsx")table =

Qt利用QLocalSocketQLocalServer實現IPC

handler delet qstring OS client 但是 main his windows系統 QLocalServer提供了一種基於本地套接字的服務器,實現了接收本地socket的連接的功能。 通過調用listen()監聽特定的連接,每次與client連接上時

Java利用waitnotify實現執行緒間通訊

       Java的Object類提供了wait和notify方法用於實現執行緒間通訊(因為所有的java類都繼承了Object類,所以所有的java類都有這兩個方法)。這兩個方法在Object類中籤名如下: pu

Python 利用BeautifulSoup正則表示式 來爬取旅遊網資料

import re import requests import time from bs4 import BeautifulSoup url = ‘http://www.cntour.cn/’ r = requests.get(url) print(r.encoding,len(r.t

利用python_opencvdlib實現從視訊中抓取人臉照片並儲存(親測有效)

系統:win10 編譯環境:pycharm python庫:cv2、dlib(自己安裝) 程式碼: import dlib import cv2 # 載入並初始化檢測器 detector = dlib.get_frontal_face_detector() camera = cv2.

利用AjaxJSON實現關於查詢省市名稱的二級聯動功能

  功能實現的思路:我們經常碰見網上購物時候填寫收件地址會用到這個查詢省市縣的三級聯動查詢功能,我們可以利用Ajax和JSON技術模擬這個功能,說白了同樣是使用Ajax的區域性資料更新功能這個特性。因為省市都會有很多個,所以還需要使用JSONArray物件。當我們選擇某一個省的時候,會自動觸發一個區域性更新功

利用floatmargin實現兩端對齊佈局

 實現效果如下圖: 這種佈局方式一般我們都會想到直接使用float浮動外加margin-right做右側留白,既實現多個小模組按順序排列, 超出一行又會自動換行,從而實現這個效果。但是,實現過程中會遇到一個問題就是最右邊的留白處理問題, 當然可以根據選擇每行會有多少個模組,設定:nth-.

根據字串的形式,自動匯入模組並使用反射找到模組中的類,並例項化物件,利用importlibgetattr實現

例如: auth資料夾下一個SCRF.py檔案,裡面有一個Cors類 class CORS(object): def process_request(self): print('666') auth資料

利用ZipOutputStreamZipInputStream實現檔案的壓縮和解壓縮

package cn.yimen.archiver.test; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.zip.ZipEn

利用MTCNNfacenet實現人臉檢測人臉識別

利用MTCNN和facenet實現人臉檢測和人臉識別     人臉檢測和人臉識別技術算是目前人工智慧方面應用最成熟的技術了。本部落格將利用mtcnn和faceNet搭建一個實現人臉檢測和人臉識別的系統。基本思路也很簡單,先利用mtcnn的進行人臉檢測,當然也可以使用其他的

利用CSSjquery 實現圓環統計圖

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>圓環統計圖</title> <script sr