聲明:轉(zhuǎn)載請(qǐng)勿刪除作者名稱。本文所介紹的算法可以遵循LGPL協(xié)議。
人類在大量的生產(chǎn)和生活過程中,會(huì)遇到一些敏感信息諸如漢人姓名、身份證號(hào)碼、體重身高等隱私數(shù)據(jù)需要向第三方數(shù)據(jù)公司開放或者在測試環(huán)境中使用而導(dǎo)致的脫敏需求。根據(jù)不同的應(yīng)用場景,可能會(huì)使用不同的策略來保證混淆或者脫敏數(shù)據(jù)可以正常工作。本文描述的是一種基于隨機(jī)亂序字源生成漢字姓名的混淆/脫敏算法。
1. 選取中文漢字中可以作為姓氏的漢字。
2. 選取中文漢字中可以作為名字的漢字,簡單起見,過濾情況1中的漢字。
3. 情況1和情況2中的漢字記錄到列表中,并進(jìn)行亂序排列。準(zhǔn)備一個(gè)[字典數(shù)據(jù)]結(jié)構(gòu)存放新舊姓名的對(duì)照關(guān)系{key=舊姓名, value=新姓名}。
4. 對(duì)于一個(gè)目標(biāo)漢人姓名,可簡單分解成[姓氏]+[名字]{1,2}的情況。如果舊姓名在[字典數(shù)據(jù)]中存在,則返回舊姓名對(duì)應(yīng)的新姓名。如果不存在,則轉(zhuǎn)到步驟5。
5. 將[姓氏]的值按照情況1中列表長度取余,得到的序號(hào)再向情況1的列表查詢作為[新的姓氏]。
6. 將每個(gè)[名字]中的漢字按照情況2中列表長度取余,得到的序號(hào)向情況2列表查詢作為[新的名字]。
7. 將[新的姓氏][新的名字]{1,2}作為[新的姓名],向[字典數(shù)據(jù)]中查詢是否作為值存放。如果可以,則維護(hù)新舊姓名對(duì)照關(guān)系。如果不可以,則對(duì)每個(gè)舊姓名的字節(jié)增加1,重復(fù)步驟5直到可以存放。
8. 數(shù)據(jù)處理完,將[字典數(shù)據(jù)]保存。由于[字典數(shù)據(jù)]中鍵值是一一對(duì)應(yīng)而且值不會(huì)重復(fù),在恢復(fù)混淆數(shù)據(jù)時(shí)候可以轉(zhuǎn)置即把值作為鍵,鍵作為值的新字典。
更新:剛剛機(jī)器跑了一下,貌似在Debug模式下面1000000(一百萬)次跑的結(jié)果是2954.5117毫秒,2.955012納秒/平均每筆。
1.88GHz的Intel Core i3-4030U,4個(gè)邏輯內(nèi)核;12G內(nèi)存(實(shí)際程序占用內(nèi)存是30M)的機(jī)器
由于簡書不支持格式化代碼以及代碼高亮顯示,而且這里空間太小寫不下,需要代碼參考的請(qǐng)勿聯(lián)系作者的微信。