C#生成比較短的Token字符串
有的時候,我們需要生成一些Token作為標識:如認證后的標識符,資源的提取碼等。一個比較常見的算法是生成一個GUID來作為Token,由于GUID的隨機性和唯一性特點,作為Token是一個非??煽康倪x擇。
GUID是一個128bit的數(shù)組,為了方便攜帶,往往需要把它表述為字符串的形式。一般把它表述為如下形式:{79FAF822-7194-4FE3-8C4F-1D99BE71BC9C}。這樣有一個弊病:太長了,那么我們?nèi)绾伟阉厅c呢?
去掉不必要的修飾符
首先可以通過去掉無意義的括號和減號來較少長度:
var token = guid.ToString("N");
這樣字符串就成為:79faf82271944fe38c4f1d99be71bc9c。感覺還是蠻長的。
使用Base64編碼來表示
前面的表示方法中,是使用的16機制來表示的,如果使用Base64編碼的話,則可以進一步壓縮字符串
var token = Convert.ToBase64String(guid.ToByteArray()).TrimEnd('=');
這樣字符串就成為:Ivj6eZRx40+MTx2ZvnG8nA。看起來稍微好一點了。
換一種Token生成方式
在使用Base64方式的編碼后,Token字符串還是有20多位,有的時候還是嫌它長了。由于GUID本身就有128bit,在要求有良好的可讀性的前提下,很難進一步改進了。那我們?nèi)绾萎a(chǎn)生更短的字符串呢?還有一種方式就是較少Token的長度,不用GUID,而采用一定長度的隨機數(shù),例如64bit,再用Base64編碼表示:
var rnd = new Random(); var tokenData = new byte[8]; rnd.NextBytes(tokenData); var token = Convert.ToBase64String(tokenData).TrimEnd('=');
由于這里只用了64bit,此時得到的字符串為Onh0h95n7nw的形式,長度要短一半。這樣就方便攜帶多了。但是這種方式是沒有唯一性保證的。不過用來作為身份認證的方式還是可以的(如網(wǎng)盤的提取碼)。
更進一步
前面的算法中,長度和隨機性倒是有了,但是沒有唯一性。對于需要唯一性的場景,則需要改寫一下token的生成算法了,我在這里給一個簡單的示例:
class Token { static Random rnd = new Random(); static int seed = 0; public static string Create() { var rndData = new byte[4]; rnd.NextBytes(rndData); var seedValue = Interlocked.Add(ref seed, 1); var seedData = BitConverter.GetBytes(seedValue); var tokenData = rndData.Concat(seedData).OrderBy(_ => rnd.Next()); return Convert.ToBase64String(tokenData.ToArray()).TrimEnd('='); } }
這里我的算法非常簡單:
- token由兩部分組成,32位的隨機數(shù)+32位的序列
- 由序列保證唯一性,由隨機數(shù)保證隨機性。
- 組合后再進行一次shuffle。
當然,我這個算法也有一定的局限性,如:
- Token只能在4G范圍內(nèi)保證唯一
- Token只能在上下文中保證唯一
- Token不是完全隨機的
要解決這幾個問題,實現(xiàn)在任何時候,任何位置,任何情況下產(chǎn)生的Token都具有唯一性和隨機性也是能做到的。但是,要知道的是,任何功能都是附有一定的代價的。這些條件往往帶來的代價就是Token長度增加——GUID就是滿足這一系列條件的算法。軟件的世界沒有銀彈,我們只要在一定范圍內(nèi)找到能解決問題的方法即可。
到此這篇關于C#生成Token字符串的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
C#實現(xiàn)char字符數(shù)組與字符串相互轉換的方法
這篇文章主要介紹了C#實現(xiàn)char字符數(shù)組與字符串相互轉換的方法,結合實例形式簡單分析了C#字符數(shù)組轉字符串及字符串轉字符數(shù)組的具體實現(xiàn)技巧,需要的朋友可以參考下2017-02-02C#9.0新特性詳解——頂級程序語句(Top-Level Programs)
這篇文章主要介紹了C#9.0新特性詳解——頂級程序語句(Top-Level Programs)的相關資料,幫助大家更好的理解和學習c#,感興趣的朋友可以了解下2020-12-12如何利用Jenkins + TFS為.Net Core實現(xiàn)持續(xù)集成/部署詳解
這篇文章主要給大家介紹了關于如何利用Jenkins + TFS為.Net Core實現(xiàn)持續(xù)集成/部署的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧2018-05-05