摘要:自增序列類型數(shù)字主鍵,完全的自動增長,容易被判斷推導出其他的主鍵值。本方案就是使用解決易推導的問題,并且在數(shù)據(jù)量不大的情況下也不大。這些是彼此獨立生成的,碰撞風險非常小,可以忽略不計。是可以根據(jù)鹽值反向解碼的。增量輸入被破壞以保持不可思議。
ID管理方式的介紹
32位UUID轉(zhuǎn)Base64編碼,快速的id生成方案,問題在于編碼可讀性差,長度太長,查詢效率低。
自增序列類型數(shù)字主鍵,完全的自動增長,容易被判斷推導出其他的主鍵值。本方案就是使用hashids解決id易推導的問題,并且id在數(shù)據(jù)量不大的情況下也不大。
根據(jù)時間戳生成ID。如果你能承受一定程度的碰撞,你可以編寫一個動態(tài)建立的id。使用計數(shù)器(如果有的話)+時間戳(以毫秒為單位)+某個系統(tǒng)值(IP地址或某個機器ID)+隨機整數(shù)。許多大公司都采用這種方法,因為它在分布式系統(tǒng)中運行良好。這些ID是彼此獨立生成的,碰撞風險非常小,可以忽略不計。一般可能需要依賴redis等服務。
Hashids是一個小型開源庫,可以從數(shù)字中生成簡短,獨特,非順序的ID。它將像347這樣的數(shù)字轉(zhuǎn)換為像“yr8”這樣的字符串,或者像[27,986]這樣的數(shù)字數(shù)組轉(zhuǎn)換為“3kTMd”。這在將多個參數(shù)捆綁到一個或簡單地將它們用作短UID時非常有用。
注意Hashids不是真正的加密算法,Hashids的工作方式與整數(shù)轉(zhuǎn)換為十六進制的方式類似,但有一些例外:
1.字母表不是base16,而是默認的base base62。
2.字母表也根據(jù)鹽進行洗牌。
?Hashids一種混淆數(shù)字的算法,與普通意義的hash(類似md5等的單向散列算法)不是一個意思。Hashids是可以根據(jù)鹽值反向解碼的。因為鹽值的存在,可以一定程度的防止破解。
特征
1.從數(shù)字(正數(shù)和零)創(chuàng)建短唯一ID。
2.允許自定義字母和鹽 - 所以ID只有你自己。
3.增量輸入被破壞以保持不可思議。
4.代碼很?。s350行),速度快,不依賴于外部庫。
Hashid庫可以支持各種語言,例如javascript或者java。以下以java為例。
import org.hashids.Hashids; public class HashIds { public static void main(String[] args) { Hashids hashids = new Hashids("this is my salt"); long a=12345678L; System.err.println("1待轉(zhuǎn)碼的數(shù)字:"+a); String hash = hashids.encode(a); System.err.println("1轉(zhuǎn)碼結(jié)果:"+hash); hashids = new Hashids("this is my salt");//用加密的鹽解密 long[] numbers = hashids.decode(hash); System.err.println("1解碼結(jié)果:"+numbers[0]);//其可以加密數(shù)組,默認相當于數(shù)組 long b1=100L; long b2=200L; Hashids hashids2 = new Hashids("this is my salt", 8);//8代表最低轉(zhuǎn)碼位數(shù),防止位數(shù)太少 System.out.println("2待轉(zhuǎn)碼的數(shù)字組合:"+b1+","+b2); String hash2 = hashids2.encode(b1,b2); System.out.println("2轉(zhuǎn)碼結(jié)果:"+hash2); hashids2= new Hashids("this is my salt", 8); long[] numbers2 = hashids2.decode(hash2); System.out.println("2解碼結(jié)果:"+numbers2[0]+","+numbers2[1]); } }
如果是maven程序,可以在pom這樣引入
org.hashids hashids 1.0.3
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/77851.html
摘要:內(nèi)存泄漏當應用內(nèi)部不再需要某個實例后,但是這個對象卻仍然被引用,這個情況就叫做內(nèi)存泄露。安卓虛擬機為每一個應用分配一定的內(nèi)存空間,當內(nèi)存泄露到達一定的程度就會造成內(nèi)存溢出。點擊登錄跳轉(zhuǎn)頁面中所有操作都與用戶密切相關(guān),是 Android: 今日頭條屏幕適配的原理? 1:首先計算出 density,計算公式:當前設(shè)備屏幕總寬度(單位為像素)/ 設(shè)計圖總寬度(單位為 dp) = densit...
摘要:可實現(xiàn)單例模式代碼塊初始化靜態(tài)變量,只被執(zhí)行一次內(nèi)部類不能與外部類重名,只能訪問外部類靜態(tài)數(shù)據(jù)包括私有多分支選擇整型或字符類型變量或整數(shù)表達式開始支持。 前言 大學期間接觸 Java 的時間也不短了,不論學習還是實習,都讓我發(fā)覺基礎(chǔ)的重要性?;ヂ?lián)網(wǎng)發(fā)展太快了,各種框架各種技術(shù)更新迭代的速度非常快,可能你剛好掌握了一門技術(shù)的應用,它卻已經(jīng)走在淘汰的邊緣了。 而學習新技術(shù)總要付出一定的時間...
摘要:本文重點掌握可迭代的對象的定義掌握可迭代對象迭代器與生成器之間的關(guān)系和異同熟悉標準庫中生成器。二迭代器迭代器介紹迭代器用于從集合中取出元素的對象。若想再次迭代須重建迭代器。迭代器檢查方式調(diào)用,。區(qū)別可迭代的對象不是迭代器。 導語:本文章記錄了本人在學習Python基礎(chǔ)之控制流程篇的重點知識及個人心得,打算入門Python的朋友們可以來一起學習并交流。 本文重點: 1、掌握可迭代的對象的...
摘要:查看原函數(shù)的參數(shù)注釋甚至函數(shù)名的時候,只能看到裝飾器的相關(guān)信息。也就是說,它是裝飾器的裝飾器,并且以原函數(shù)為參數(shù),作用是保留原函數(shù)的各種信息,使得我們之后查看被裝飾了的原函數(shù)的信息時,可以保持跟原函數(shù)一模一樣。 貌似只能創(chuàng)建一個專欄,所以這篇文章只好放到JavaScript從前端到全終端里了? 原文鏈接:Effective Python Python 作為一門入門極易并容易上癮的語...
閱讀 1889·2021-11-22 09:34
閱讀 3179·2019-08-30 15:55
閱讀 750·2019-08-30 15:53
閱讀 2130·2019-08-30 15:52
閱讀 3058·2019-08-29 18:32
閱讀 2075·2019-08-29 17:15
閱讀 2457·2019-08-29 13:14
閱讀 3609·2019-08-28 18:05