首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >.Net如何将“数字(或)长字符串”加密成“短字符串”,作短链接之类等用处

.Net如何将“数字(或)长字符串”加密成“短字符串”,作短链接之类等用处

作者头像
郑子铭
发布2023-10-09 09:54:36
发布2023-10-09 09:54:36
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

概述

本文为.NET开发者们分享一款轻量级开源的将数字编码成字符串的加密(短ID生成)工具类库—Hashids.net。

无论在前端还是后端的编程开发中,都会遇到让系统自动生成一些编码或者ID的场景,并且要求生成的编码或ID是不重复的(重复率极低的)。

前端开发中,常用的有**nanoid[1]**。而后端开发中,常用的技术则有:自增ID,雪花ID,GUID等。其中,自增ID在中小型系统中使用比较常见,它占用的存储空间相对较小,检索速度相对较快,但它不适用于分布式系统的构建,而雪花ID和GUID等占用字节较多,占用存储空间较大,检索速度相对较慢,但后两者适用于分布式的系统构建。

另外,还有一些场景,为了隐藏后端的真实ID,在显示到客户端时,对真实ID进行加密处理,将真实的数字加密生成一个短的字符串,比如国外知名视频网站油管的视频地址类似https://www.yt.com/watch?v=yVd7vbeFj-g,其中的参数v的值yVd7vbeFj-g即为一个加密的字符串。

在.NET, .NET Core, .NET 5\6\7\8等程序开发中,如果你也想生成类似的加密字符串,本文为.NET开发者们推荐Hashids.net这个开源的短ID生成(加密)类库。

第一部分:将数字加密成短字符串

Hashids.net功能和特性

Hashids.net可以将数字转换成字符串,比如将347转换成yr8,或者将数字数组[27, 986]转换成3kTMd。当然,你也可以将转换后的字符串再次转换成数字或者数字数组。这在将多个参数捆绑成一个参数、隐藏实际ID或简单地将它们用作短字符串ID时非常有用。

Hashids.net主要有如下的特性:

  • 将整数转换成惟一的短ID(仅支持包含零在内的正整数)
  • 为自增ID生成不可推测的非连续id
  • 支持单个数字或数字数组
  • 允许自定义字母和盐
  • 允许指定最小哈希长度

Hashids.net的安装

Hashid.net以NuGet包发布,所以有如下的安装方式:

1.NuGet命令行

代码语言:javascript
代码运行次数:0
运行
复制
Install-Package Hashids.net

2.NuGet程序包管理工具

在项目中右键单击依赖项,如图:

然后,在打开的NuGet程序包管理界面输入关键字Hashids.net,在搜索到的结果中选中Hashids.net类库组件并安装,如图:

Hashids.net的使用

导入Hashids.net的命名空间

代码语言:javascript
代码运行次数:0
运行
复制
using HashidsNet;

编码单个数字

实例化Hashids对象时,你可以传递一个唯一的盐值,这样你的哈希值就不同于其他人的哈希值。这里使用this is my salt作为例子。

代码语言:javascript
代码运行次数:0
运行
复制
var Hashids = new Hashids("this is my salt");
var hash = hashids.Encode(12345);

运行结果为:NkK9

如果要转换一个Int64类型的数字,则需要调用EncodeLong()方法,如下:

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my salt");
var hash = hashids.EncodeLong(666555444333222L);

运行结果为:KVO9yy1oO5j

解码

Hashids.net提供了将已编码的字符串反解码的功能,但解码时需使用与编码相同的盐值:

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my salt");
numbers = hashids.Decode("NkK9");

运行结果为:[ 12345 ]

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my salt");
numbers = hashids.DecodeLong("KVO9yy1oO5j");

运行结果为:[ 666555444333222L ]

使用不同的盐值解码

如果解码时的盐值与编码时不相同,则解码将失败:

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my pepper");
numbers = hashids.Decode("NkK9");

运行结果为:[]

编码多个数字

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my salt");
var hash = hashids.Encode(683, 94108, 123, 5);

运行结果为:aBMswoO2UB3Sj

多个数字编码后的解码

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my salt");
var numbers = hashids.Decode("aBMswoO2UB3Sj")

运行结果为:[ 683, 94108, 123, 5 ]

指定编码后的最小哈希长度

以下示例将对整数1进行编码,并将最小哈希长度设置为8(默认情况下是0——这意味着哈希将是可能的最短长度)。

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my salt", 8);
var hash = hashids.Encode(1);

运行结果为:gB0NV05e

解码

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my salt", 8);
var numbers = hashids.Decode("gB0NV05e");

运行结果为:[ 1 ]

自定义哈希字母

以下示例指定了自定义的哈希字母为abcdefghijkABCDEFGHIJK12345

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my salt", 0, "abcdefghijkABCDEFGHIJK12345")
var hash = hashids.Encode(1, 2, 3, 4, 5)

运行结果为:Ec4iEHeF3

Hashids.net的随机性

Hashids.net的主要目的是混淆ID,此外,它还可以让有规律的数字变得不可猜测和不可预测。

编码重复的数字

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my salt");
var hash = hashids.Encode(5, 5, 5, 5);

编码后,你不会看到任何重复的模式来表明哈希中有4个相同的数字,运行结果为:1Wc8cwcE

编码有序的数字

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my salt");
var hash = hashids.Encode(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

运行结果为:kRHnurhptKcjIDTWC3sx

编码自增的数字

代码语言:javascript
代码运行次数:0
运行
复制
var hashids = new Hashids("this is my salt");

hashids.Encode(1); // => NV
hashids.Encode(2); // => 6m
hashids.Encode(3); // => yD
hashids.Encode(4); // => 2l
hashids.Encode(5); // => rD

第二部分:将长字符串加密成短字符串

  • 可逆算法示例(C#):
代码语言:javascript
代码运行次数:0
运行
复制
public static string ShortenString(string longString)
{
    byte[] bytes = Encoding.UTF8.GetBytes(longString);
    string shortString = Convert.ToBase64String(bytes);
    return shortString;
}

public static string RestoreString(string shortString)
{
    byte[] bytes = Convert.FromBase64String(shortString);
    string longString = Encoding.UTF8.GetString(bytes);
    return longString;
}
  • 不可逆算法示例(C#):
代码语言:javascript
代码运行次数:0
运行
复制
public static string ShortenString(string longString)
{
    using (SHA256 sha256 = SHA256.Create())
    {
        byte[] hashBytes = sha256.ComputeHash(Encoding.UTF8.GetBytes(longString));
        string shortString = Convert.ToBase64String(hashBytes);
        return shortString;
    }
}
  • 区别:
    • 可逆算法可以通过短字符串还原为原字符串,而不可逆算法无法还原。
    • 可逆算法生成的短字符串长度较长,而不可逆算法生成的短字符串长度较短。
    • 使用算法自动生成短字符串可能存在短字符串冲突的问题,即不同的长字符串可能生成相同的短字符串。
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DotNet NB 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 概述
  • Hashids.net功能和特性
  • Hashids.net的安装
  • Hashids.net的使用
    • 导入Hashids.net的命名空间
    • 编码单个数字
    • 解码
    • 使用不同的盐值解码
    • 编码多个数字
    • 多个数字编码后的解码
    • 指定编码后的最小哈希长度
    • 解码
    • 自定义哈希字母
  • Hashids.net的随机性
    • 编码重复的数字
    • 编码有序的数字
    • 编码自增的数字
  • 第二部分:将长字符串加密成短字符串
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档