hashids插件庫解決序列id易泄露易推導的問題

ID管理方式的介紹

  1. 32位UUID轉Base64編碼,快速的id生成方案,問題在於編碼可讀性差,長度太長,查詢效率低。
  2. 自增序列類型數字主鍵,完全的自動增長,容易被判斷推導出其他的主鍵值。本方案就是使用hashids解決id易推導的問題,並且id在數據量不大的情況下也不大。
  3. 根據時間戳生成ID。如果你能承受一定程度的碰撞,你可以編寫一個動態建立的id。使用計數器(如果有的話)+時間戳(以毫秒爲單位)+某個系統值(IP地址或某個機器ID)+隨機整數。許多大公司都採用這種方法,因爲它在分佈式系統中運行良好。這些ID是彼此獨立生成的,碰撞風險非常小,可以忽略不計。一般可能需要依賴redis等服務。

Hashids是一個小型開源庫,可以從數字中生成簡短,獨特,非順序的ID。

它將像347這樣的數字轉換爲像“yr8”這樣的字符串,或者像[27,986]這樣的數字數組轉換爲“3kTMd”。這在將多個參數捆綁到一個或簡單地將它們用作短UID時非常有用。
注意Hashids不是真正的加密算法,Hashids的工作方式與整數轉換爲十六進制的方式類似,但有一些例外:
1.字母表不是base16,而是默認的base base62。
2.字母表也根據鹽進行洗牌。
 Hashids一種混淆數字的算法,與普通意義的hash(類似md5等的單向散列算法)不是一個意思。Hashids是可以根據鹽值反向解碼的。因爲鹽值的存在,可以一定程度的防止破解。
特徵
1.從數字(正數和零)創建短唯一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待轉碼的數字:"+a);
        String hash = hashids.encode(a);
        System.err.println("1轉碼結果:"+hash);
        hashids = new Hashids("this is my salt");//用加密的鹽解密
        long[] numbers = hashids.decode(hash);
        System.err.println("1解碼結果:"+numbers[0]);//其可以加密數組,默認相當於數組
        
        
        long b1=100L;
        long b2=200L;
        Hashids hashids2 = new Hashids("this is my salt", 8);//8代表最低轉碼位數,防止位數太少
        System.out.println("2待轉碼的數字組合:"+b1+","+b2);
        String hash2 = hashids2.encode(b1,b2);
        System.out.println("2轉碼結果:"+hash2);
         hashids2= new Hashids("this is my salt", 8);
        long[] numbers2 = hashids2.decode(hash2);
        System.out.println("2解碼結果:"+numbers2[0]+","+numbers2[1]);
    }
}

如果是maven程序,可以在pom這樣引入

<dependency>
   <groupId>org.hashids</groupId>
   <artifactId>hashids</artifactId>
   <version>1.0.3</version>
</dependency>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章