我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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

有的时候,我们需要生成一些Token作为标识:如认证后的标识符,资源的提取码等。一个比较常见的算法是生成一个GUID来作为Token,由于GUID的随机性和唯一性特点,作为Token是一个非常可靠的选择。

GUID是一个128bit的数组,为了方便携带,往往需要把它表述为字符串的形式。一般把它表述为如下形式:{79FAF822-7194-4FE3-8C4F-1D99BE71BC9C}。这样有一个弊病:太长了,那么我们如何把它弄短点呢?

去掉不必要的修饰符

首先可以通过去掉无意义的括号和减号来较少长度:

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,而采用一定长度的随机数,例如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位的随机数+32位的序列
  • 由序列保证唯一性,由随机数保证随机性。
  • 组合后再进行一次shuffle。

当然,我这个算法也有一定的局限性,如:

  • Token只能在4G范围内保证唯一
  • Token只能在上下文中保证唯一
  • Token不是完全随机的

要解决这几个问题,实现在任何时候,任何位置,任何情况下产生的Token都具有唯一性和随机性也是能做到的。但是,要知道的是,任何功能都是附有一定的代价的。这些条件往往带来的代价就是Token长度增加——GUID就是满足这一系列条件的算法。软件的世界没有银弹,我们只要在一定范围内找到能解决问题的方法即可。

到此这篇关于C#生成Token字符串的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持编程网。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

C#中怎么比较字符串

今天小编给大家分享一下C#中怎么比较字符串的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。实例using System;nam
2023-06-17

c#怎么比较字符串内容

在 c# 中,可以通过以下几种方法比较字符串内容:字符串相等操作符(== 和 !=)、字符串.equals 方法、字符串.compare 方法、字符串.compareordinal 方法、字符串.startswith 和 string.en
c#怎么比较字符串内容
2024-05-12

C/C++中比较字符串的方法详解

这篇文章主要介绍了C/C++中比较字符串的方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
2023-02-05

#Python3中字符串的比较

20.字符串的比较从第一个字符开始比较谁的ASCII值谁就大如果前面相同 则比较后一位直到比较出谁大如果都相同 则相等print("acc"<"b")#(输出)Trueprint("sunck"=="sunck")#(输出)Trueprin
2023-01-31

C语言如何比较两个字符串

本文介绍了4种C语言中比较两个字符串的方法:字符数组比较、使用库函数、使用指针比较和strlen()函数比较。字符数组比较是最直接但效率最低的方法,而使用库函数strcmp()是最常用的。指针比较最有效率,但复杂度较高;strlen()函数比较仅适用于长度相同的字符串。选择最佳方法取决于具体情况。
C语言如何比较两个字符串
2024-04-02

c语言如何进行字符串比较

这篇文章将为大家详细讲解有关c语言如何进行字符串比较,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。C语言是什么C语言是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发,使用C语言可以以简易的方
2023-06-14

PHP比较两个字符串的方法

这篇文章主要讲解了“PHP比较两个字符串的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“PHP比较两个字符串的方法”吧!字符串比较是字符串处理中常见的一种操作,PHP中比较两个字符串有很
2023-06-20

c语言怎么用strcpy比较字符串大小

在C语言中,可以使用strcmp函数来比较两个字符串的大小。strcpy函数是用来复制一个字符串到另一个字符串中的函数,并不用于比较字符串大小。下面是一个示例代码来比较两个字符串的大小:#include #inclu
c语言怎么用strcpy比较字符串大小
2024-03-02

【2】python3字符串的比较(辨析i

Python3字符串 ①字符串比较1、比较字符串是否相同:==:使用==来比较两个字符串内的value值是否相同is:比较两个字符串的id值。2、字符串的长度比较len():显示字符串的长度,返回数字整型。可以进行长度的比较。3、使用比较运
2023-01-30

比较同一字符串中相邻字符的方法

从现在开始,努力学习吧!本文《比较同一字符串中相邻字符的方法》主要讲解了等等相关知识点,我会在编程网中持续更新相关的系列文章,欢迎大家关注并积极留言建议。下面就先一起来看一下本篇正文内容吧,希望能帮到你!问题内容我在如何使用字符串进行操作方
比较同一字符串中相邻字符的方法
2024-04-04

Java字符串比较的方法有哪些

本篇内容主要讲解“Java字符串比较的方法有哪些”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java字符串比较的方法有哪些”吧!java字符串如何进行比较我们可以根据内容和引用来比较Java中
2023-07-05

c语言中怎么用strcmp比较两个字符串

在C语言中,可以使用strcmp函数来比较两个字符串。strcmp函数是一个标准库函数,用于比较两个字符串的大小。strcmp函数的原型如下:```cint strcmp(const char *str1, const char *str2
2023-10-10

php中怎么比较字符串的异同

php中怎么比较字符串的异同,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。
2023-06-20

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录