題目:設計一個身份證查詢系統,將身份證號md5 以後存儲,輸入md5值查詢對應的身份證號。 要求:成本低,查詢速度快python
身份號碼是特徵組合碼,由前十七位數字本體碼和最後一位數字校驗碼組成。排列順序從左至右依次爲六位數字地址碼,八位數字出生日期碼,三位數字順序碼和一位數字校驗碼。git
地址碼: 表示編碼對象常住戶口所在縣(市、旗、區)的行政區劃代碼。對於新生兒,該地址碼爲戶口登記地行政區劃代碼。須要沒說明的是,隨着行政區劃的調整,同一個地方進行戶口登記的可能存在地址碼不一致的狀況。行政區劃代碼按GB/T2260的規定執行。github
出生日期碼:表示編碼對象出生的年、月、日,年、月、日代碼之間不用分隔符,格式爲YYYYMMDD,如19880328。按GB/T 7408的規定執行。原15位身份證號碼中出生日期碼還有對百歲老人特定的標識,其中99九、99八、99七、996分配給百歲老人。算法
順序碼: 表示在同一地址碼所標識的區域範圍內,對同年、同月、同日出生的人編定的順序號,順序碼的奇數分配給男性,偶數分配給女性。數據庫
校驗碼: 根據本體碼,經過採用ISO 7064:1983,MOD 11-2校驗碼系統計算出校驗碼。算法可參考下文。前面有提到數字校驗碼,咱們知道校驗碼也有X的,實質上爲羅馬字符X,至關於10.小程序
將本體碼各位數字乘以對應加權因子並求和,除以11獲得餘數,根據餘數經過校驗碼對照表查得校驗碼。設計模式
加權因子表:數據結構
+-----------------------------------------------------------+
|位置序號|1 |2 |3 |4 |5 |6 |7 |8 |9 |10|11|12|13|14|15|16|17|
+-----------------------------------------------------------+
|加權因子|7 |9 |10|5 |8 |4 |2 |1 |6 |3 |7 |9 |10|5 |8 |4 |2 |
+-----------------------------------------------------------+
複製代碼
校驗碼錶:併發
+----------------------------------------------------+
| 餘數 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
+----------------------------------------------------+
| 校驗碼| 1 | 0 | X | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 |
+----------------------------------------------------+
複製代碼
本體碼爲11010519491231002curl
**所以完整身份證號爲:11010519491231002X **
3465x100x365x999=126346027500
32+18=50B
存儲方式有文件存儲、關係型數據庫存儲和es存儲等。從結果能夠看到有接近6T的數據,若是存入數據庫或es成本較高,這裏選擇以文件的方式存儲。
那有沒有方式壓縮存儲空間呢?
那如今有一個問題,每一個文件多大合適呢?
若是文件太大,每次將文件讀取到內存中耗時較長,若是文件過小,則會生成太多的文件可能超出系統的文件數限制。
這裏能夠參考數據庫索引的存儲方式,設定每一個數據文件的大小(2.8T數據能夠設置每一個數據文件1G左右。
索引數據結構爲:
# 爲了簡化存儲,這裏file一、file二、file三、file4 爲該文件第一條數據的md5值,也是對應的文件名
# 頁的大小固定,因此二級索引只須要按順序記錄每頁的第一個md5值便可
indexes = {
"file1": ["md51", "md52", "md53", "..."],
"file2": ["md51", "md52", "md53", "..."],
"file3": ["md51", "md52", "md53", "..."],
"file4": ["md51", "md52", "md53", "..."],
}
複製代碼
第一層索引爲文件索引,首先經過md5值判斷md5值所在文件,好比輸入的 start1 > md5 > start1,能夠判斷結果可能在file1 中;
第二層爲文件內索引,經過md5值判斷所在的頁,讀取根據offset讀取該頁的所有數據,再經過二分查找找到對應的身份證號。
代碼實現源碼地址:github.com/gusibi/onep…
使用方式:
1. go run main.go
2. curl http://127.0.0.1:8080/search?md5={id md5}
複製代碼
最後,感謝女友支持和包容,比❤️
也能夠在公號輸入如下關鍵字獲取歷史文章:公號&小程序
| 設計模式
| 併發&協程