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