亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C#生成比較短的Token字符串

 更新時間:2022年06月22日 09:52:15   作者:天方  
這篇文章介紹了C#生成Token字符串的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下

有的時候,我們需要生成一些Token作為標識:如認證后的標識符,資源的提取碼等。一個比較常見的算法是生成一個GUID來作為Token,由于GUID的隨機性和唯一性特點,作為Token是一個非??煽康倪x擇。

GUID是一個128bit的數(shù)組,為了方便攜帶,往往需要把它表述為字符串的形式。一般把它表述為如下形式:{79FAF822-7194-4FE3-8C4F-1D99BE71BC9C}。這樣有一個弊?。禾L了,那么我們如何把它弄短點呢?

去掉不必要的修飾符

首先可以通過去掉無意義的括號和減號來較少長度:

var token = guid.ToString("N");

這樣字符串就成為:79faf82271944fe38c4f1d99be71bc9c。感覺還是蠻長的。

使用Base64編碼來表示

前面的表示方法中,是使用的16機制來表示的,如果使用Base64編碼的話,則可以進一步壓縮字符串

var token = Convert.ToBase64String(guid.ToByteArray()).TrimEnd('=');

這樣字符串就成為:Ivj6eZRx40+MTx2ZvnG8nA。看起來稍微好一點了。

換一種Token生成方式

在使用Base64方式的編碼后,Token字符串還是有20多位,有的時候還是嫌它長了。由于GUID本身就有128bit,在要求有良好的可讀性的前提下,很難進一步改進了。那我們如何產生更短的字符串呢?還有一種方式就是較少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的形式,長度要短一半。這樣就方便攜帶多了。但是這種方式是沒有唯一性保證的。不過用來作為身份認證的方式還是可以的(如網盤的提取碼)。

更進一步

前面的算法中,長度和隨機性倒是有了,但是沒有唯一性。對于需要唯一性的場景,則需要改寫一下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范圍內保證唯一
  • Token只能在上下文中保證唯一
  • Token不是完全隨機的

要解決這幾個問題,實現(xiàn)在任何時候,任何位置,任何情況下產生的Token都具有唯一性和隨機性也是能做到的。但是,要知道的是,任何功能都是附有一定的代價的。這些條件往往帶來的代價就是Token長度增加——GUID就是滿足這一系列條件的算法。軟件的世界沒有銀彈,我們只要在一定范圍內找到能解決問題的方法即可。

到此這篇關于C#生成Token字符串的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • C#通過流寫入一行數(shù)據到文件的方法

    C#通過流寫入一行數(shù)據到文件的方法

    這篇文章主要介紹了C#通過流寫入一行數(shù)據到文件的方法,涉及C#針對文本文件讀寫的基本技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • winform去掉右上角關閉按鈕的方法

    winform去掉右上角關閉按鈕的方法

    這篇文章主要介紹了winform去掉右上角關閉按鈕的方法,需要的朋友可以參考下
    2014-02-02
  • 利用C#實現(xiàn)在Word中更改字體顏色

    利用C#實現(xiàn)在Word中更改字體顏色

    在日常工作中,我們有時會需要修改字體的顏色來突出文本重點,讓讀者更容易抓住文章要點。在今天這篇文章中,我將為大家介紹如何以編程方式,在Word更改字體顏色,感興趣的可以了解一下
    2023-02-02
  • C#進行文件讀寫、創(chuàng)建、復制、移動、刪除的方法

    C#進行文件讀寫、創(chuàng)建、復制、移動、刪除的方法

    這篇文章主要介紹了C#進行文件讀寫、創(chuàng)建、復制、移動、刪除的方法,涉及C#針對文件操作的常用技巧,非常具有實用價值,需要的朋友可以參考下
    2015-03-03
  • C++中#include頭文件的示例詳解

    C++中#include頭文件的示例詳解

    在C++中,所有的文件操作,都是以流(stream)的方式進行的,fstream也就是文件流file stream。這篇文章主要介紹了C++中#include頭文件,需要的朋友可以參考下
    2020-02-02
  • C#編程獲取客戶端計算機硬件及系統(tǒng)信息功能示例

    C#編程獲取客戶端計算機硬件及系統(tǒng)信息功能示例

    這篇文章主要介紹了C#編程獲取客戶端計算機硬件及系統(tǒng)信息功能,可實現(xiàn)針對客戶端系統(tǒng)CPU、硬盤、主板等硬件信息及客戶端操作系統(tǒng)、IP、MAC等信息的操作技巧,需要的朋友可以參考下
    2017-01-01
  • C# SortedList排序列表的實現(xiàn)

    C# SortedList排序列表的實現(xiàn)

    本文主要介紹了C# SortedList排序列表的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • C#從DataTable獲取數(shù)據的方法

    C#從DataTable獲取數(shù)據的方法

    這篇文章主要介紹了C#從DataTable獲取數(shù)據的方法,涉及C#操作DataTable的相關技巧,需要的朋友可以參考下
    2015-06-06
  • C# JavaScriptSerializer序列化時的時間處理詳解

    C# JavaScriptSerializer序列化時的時間處理詳解

    這篇文章主要為大家詳細介紹了C# JavaScriptSerializer序列化時的時間處理詳解,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • C#同步網絡時間的方法實例詳解

    C#同步網絡時間的方法實例詳解

    這篇文章主要介紹了C#同步網絡時間的方法,以實例形式較為詳細的分析了C#獲取網絡時間與同步本機系統(tǒng)時間的相關技巧,非常具有實用價值,需要的朋友可以參考下
    2015-05-05

最新評論