C# 生成有序Guid

news/2024/4/19 13:23:46/文章来源:https://blog.csdn.net/xk_hypothesis/article/details/136448068

C# 生成有序Guid

public enum SequentialGuidType
{/// <summary>/// 用于 MySql 和 PostgreSql.///  当使用 <see cref="Guid.ToString()" /> 方法进行格式化时连续./// </summary>AsString,/// <summary>/// 用于 Oracle./// 当使用 <see cref="Guid.ToByteArray()" /> 方法进行格式化时连续./// </summary>AsBinary,/// <summary>/// 用以 SqlServer./// 连续性体现于 GUID 的第4块(Data4)./// </summary>AtEnd
}public static class GuidHelper
{private const byte version = (byte)4;private const byte variant = (byte)8;private const byte filterHighBit = 0b00001111;private const byte filterLowBit = 0b11110000;private static readonly RandomNumberGenerator _randomNumberGenerator = RandomNumberGenerator.Create();/// <summary>/// 连续 Guid 类型,默认:AsString./// </summary>public static SequentialGuidType SequentialGuidType { get; set; } = SequentialGuidType.AsString;/// <summary>/// 生成连续 Guid./// </summary>/// <returns></returns>public static Guid Next(){return Next(SequentialGuidType);}/// <summary>/// 生成连续 Guid(生成的 Guid 并不符合 RFC 4122 标准)./// 来源:Abp. from jhtodd/SequentialGuid https://github.com/jhtodd/SequentialGuid/blob/master/SequentialGuid/Classes/SequentialGuid.cs ./// </summary>/// <param name="guidType"></param>/// <returns></returns>public static Guid NextOld(SequentialGuidType guidType){var randomBytes = new byte[8];_randomNumberGenerator.GetBytes(randomBytes);long timestamp = DateTime.UtcNow.Ticks;byte[] timestampBytes = BitConverter.GetBytes(timestamp);if (BitConverter.IsLittleEndian){Array.Reverse(timestampBytes);}byte[] guidBytes = new byte[16];switch (guidType){case SequentialGuidType.AsString:case SequentialGuidType.AsBinary:// 16位数组:前8位为时间戳,后8位为随机数Buffer.BlockCopy(timestampBytes, 0, guidBytes, 0, 8);Buffer.BlockCopy(randomBytes, 0, guidBytes, 8, 8);// .NET中,Data1、Data2、Data3 块 分别视为 Int32、Int16、Int16,在小端系统,需要翻转这3个块。if (guidType == SequentialGuidType.AsString && BitConverter.IsLittleEndian){Array.Reverse(guidBytes, 0, 4);Array.Reverse(guidBytes, 4, 2);Array.Reverse(guidBytes, 6, 2);}break;case SequentialGuidType.AtEnd:// 16位数组:前8位为随机数,后8位为时间戳Buffer.BlockCopy(randomBytes, 0, guidBytes, 0, 8);Buffer.BlockCopy(timestampBytes, 6, guidBytes, 8, 2);Buffer.BlockCopy(timestampBytes, 0, guidBytes, 10, 6);break;}return new Guid(guidBytes);}/// <summary>/// 生成连续 Guid./// </summary>/// <param name="guidType"></param>/// <returns></returns>public static Guid Next(SequentialGuidType guidType){// see: What is a GUID? http://guid.one/guid// see: https://github.com/richardtallent/RT.Comb#gory-details-about-uuids-and-guids// According to RFC 4122:// dddddddd-dddd-Mddd-Ndrr-rrrrrrrrrrrr// - M = RFC 版本(version), 版本4的话,值为4// - N = RFC 变体(variant),值为 8, 9, A, B 其中一个,这里固定为8// - d = 从公元1年1月1日0时至今的时钟周期数(DateTime.UtcNow.Ticks)// - r = 随机数(random bytes)var randomBytes = new byte[8];_randomNumberGenerator.GetBytes(randomBytes);long timestamp = DateTime.UtcNow.Ticks;byte[] timestampBytes = BitConverter.GetBytes(timestamp);if (BitConverter.IsLittleEndian){Array.Reverse(timestampBytes);}byte[] guidBytes = new byte[16];switch (guidType){case SequentialGuidType.AsString:case SequentialGuidType.AsBinary:// AsString: dddddddd-dddd-Mddd-Ndrr-rrrrrrrrrrrrBuffer.BlockCopy(timestampBytes, 0, guidBytes, 0, 6); // 时间戳前6个字节,共48位guidBytes[6] = (byte)((version << 4) | ((timestampBytes[6] & filterLowBit) >> 4)); // 高4位为版本 | 低4位取时间戳序号[6]的元素的高4位guidBytes[7] = (byte)(((timestampBytes[6] & filterHighBit) << 4) | ((timestampBytes[7] & filterLowBit) >> 4)); // 高4位取:[6]低4位 | 低4位取:[7]高4位guidBytes[8] = (byte)((variant << 4) | (timestampBytes[7] & filterHighBit)); // 高4位为:变体 | 低4位取:[7]低4位Buffer.BlockCopy(randomBytes, 0, guidBytes, 9, 7); // 余下7个字节由随机数组填充// .NET中,Data1、Data2、Data3 块 分别视为 Int32、Int16、Int16,在小端系统,需要翻转这3个块。if (guidType == SequentialGuidType.AsString && BitConverter.IsLittleEndian){Array.Reverse(guidBytes, 0, 4);Array.Reverse(guidBytes, 4, 2);Array.Reverse(guidBytes, 6, 2);}break;case SequentialGuidType.AtEnd:// AtEnd: rrrrrrrr-rrrr-Mxdr-Nddd-dddddddddddd// Block: 1        2    3    4    5// Data4 = Block4 + Block5// 排序顺序:Block5 > Block4 > Block3 > Block2 > Block1// Data3 = Block3 被认为是 uint16,排序并不是从左到右,为消除影响,x 位取固定值Buffer.BlockCopy(randomBytes, 0, guidBytes, 0, 6);guidBytes[6] = (byte)(version << 4); // Mx 高4位为版本 | 低4位取:全0guidBytes[7] = (byte)(((timestampBytes[7] & filterHighBit) << 4) | (randomBytes[7] & filterHighBit)); ; // dr 高4位为:时间戳[7]低4位 | 低4位取:随机数guidBytes[8] = (byte)((variant << 4) | ((timestampBytes[6] & filterLowBit) >> 4)); // Nd 高4位为:变体 | 低4位取:时间戳[6]高4位guidBytes[9] = (byte)(((timestampBytes[6] & filterHighBit) << 4) | ((timestampBytes[7] & filterLowBit) >> 4)); // dd 高4位为:时间戳[6]低4位 | 低4位取:时间戳[7]高4位Buffer.BlockCopy(timestampBytes, 0, guidBytes, 10, 6); // 时间戳前6个字节if (BitConverter.IsLittleEndian){Array.Reverse(guidBytes, 6, 2); // 包含版本号的 Data3 块需要翻转}break;}return new Guid(guidBytes);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_998629.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

nginx代理访问Kuboard, 解决日志无法查看问题

错误方式 这种代理方式在点击追踪日志按钮, 会无法查看日志, 因为日志是通过weboscket传输 worker_processes 1; #设置 Nginx 启动的工作进程数为 1。events {worker_connections 1024; ##设置每个工作进程的最大并发连接数为 1024。 }http {include mime.types; #该…

kafka如何保证消息顺序性?

kafka架构如下&#xff1a; Kafka 保证消息顺序性的关键在于其分区&#xff08;Partition&#xff09;机制。在 Kafka 中&#xff0c;每个主题&#xff08;Topic&#xff09;可以被分割成多个分区&#xff0c;消息被追加到每个分区中&#xff0c;并且在每个分区内部&#xff0c…

【C++】C++模板基础知识篇

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 泛型编程2. 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的原理2.4 函数模板的实例化2.5 模板参数的匹配原则 3. 类模板3.1 类模板的定义格式3.2 类模板的实例化…

3DES算法的起源与演进:保障信息安全的重要里程碑

title: 3DES算法的起源与演进&#xff1a;保障信息安全的重要里程碑 date: 2024/3/8 21:25:19 updated: 2024/3/8 21:25:19 tags: 3DES算法起源安全性增强三次迭代加密密钥管理复杂效率对比AES应用场景广泛Python实现示例 一、3DES算法的起源与演进 3DES算法是DES算法的增强版…

目标检测论文模型笔记——YOLO系列

1. YOLOv1的核心思想&#xff1a; YOLOv1&#xff1a;使用整张图作为输入&#xff0c;直接在输出层回归bounding box和类别&#xff1b;&#xff08;one-stage&#xff09;Faster RCNN&#xff1a;使用用整张图作为输入&#xff0c;但整体采用了RCNN&#xff1a; proposalclas…

18个惊艳的可视化大屏(第23辑):电子政务,一目了然如胸。

hello&#xff0c;我是贝格前端工场老司机&#xff0c;这是第23期了&#xff0c;本次带来可视化大屏在电子政务领域的应应用案例&#xff0c;喜欢文章的别忘点赞关注&#xff0c;文章底部也有其他行业的案例。 数据展示与监控&#xff1a; 可视化大屏可以将政务数据以图表、地…

Lwip之TCP服务端示例记录(1对多)

前言 实现多个客户端同时连接初步代码结构已经实现完成(通过轮训的方式) // // Created by shchl on 2024/3/8. // #if 1#include <string.h> #include "lwip/api.h" #include "FreeRTOS.h" #include "task.h" #include "usart.h&…

Java后端八股笔记

Java后端八股笔记 Redis八股 上两种都有可能导致脏数据 所以使用两次删除缓存的技术&#xff0c;延时是因为数据库有主从问题需要更新&#xff0c;无法达到完全的强一致性&#xff0c;只能达到控制一致性。 一般放入缓存中的数据都是读多写少的数据 业务逻辑代码&#x1f44…

机器学习——神经网络压缩

神经网络压缩 需要部署&#xff0c;设备内存和计算能力有限&#xff0c;需要进行模型压缩&#xff0c;在设备上运行的好处是低延迟&#xff0c;隐私性。 目录 不考虑硬件问题&#xff0c;只考虑通过软件算法优化。 修剪网络 参数过多或者没有用的参数&#xff0c;可以将其剪…

Node.Js编码注意事项

Node.js 中不能使用 BOM 和 DOM 的 API&#xff0c;可以使用 console 和定时器 APINode.js 中的顶级对象为 global&#xff0c;也可以用 globalThis 访问顶级对象 浏览器端js的组成 Node.js中的JavaScript组成 相比较之下发现只有console与定时器是两个API所共有的&#xff…

Linux运维:实现光盘开机自动挂载、配置本地yum源教程

Linux运维&#xff1a;实现光盘开机自动挂载、配置本地yum源教程 一、光盘开机自动挂载1、检查光驱设备2、创建挂载点3、编辑/etc/fstab文件4、测试挂载 二、配置本地yum源(挂载光盘或ISO文件)1、挂载ISO文件2、创建YUM仓库配置文件3、清理YUM缓存并测试 &#x1f496;The Begi…

【QT】创建第一个QT程序

下面的前7个可以先不看&#xff0c;直接从8开始看 1. 创建Qt程序 一个Qt程序的组成部分&#xff1a;应用程序类&#xff0c;窗口类应用程序类个数&#xff1a;有且只有一个QApplication a;如何查看类对应的模块&#xff1a;光标移动到类上&#xff0c;F1qmake模块的名字 2. …

2024 批量下载公众号文章内容/阅读数/在看数/点赞数/留言数/粉丝数导出pdf文章备份(带留言):公众号记忆承载近1500篇历史文章在线查看,找文章方便了

关于公众号文章批量下载&#xff0c;我之前写过很多文章&#xff1a; 视频更新版&#xff1a;批量下载公众号文章内容/话题/图片/封面/音频/视频&#xff0c;导出html&#xff0c;pdf&#xff0c;excel包含阅读数/点赞数/留言数 2021陶博士2006/caoz的梦呓/刘备我祖/六神读金…

分享2024年在家轻松兼职赚钱的5个副业

今天在网上看到这么一句话&#xff0c;真的让我深有感触&#xff1a;“职场人一定要有居安思危的意识&#xff0c;创业的人一定要三思而后行”。在这个瞬息万变的时代&#xff0c;连被视为铁饭碗的公务员、教师等体制内工作都不能保证一辈子的稳定。发展副业&#xff0c;似乎成…

【k8s管理--两种方式安装prometheus】

1、k8s的监控方案 1.1 Heapster Heapster是容器集群监控和性能分忻工具&#xff0c;天然的支持Kubernetes和CoreOS。 Kubernetes有个出名的监控agent–cAdvisor。在每个kubernetes Node上都会运行cAdvisor&#xff0c;它会收集本机以及容器的监控数(cpu,memory,filesystem,ne…

谈谈鸿蒙的跨端技术方案

这两年要说技术上最火的关键字&#xff0c;我想肯定离不开“鸿蒙”两个字。 不管是技术社区还是身边的开发者多多少少都在关注鸿蒙的发展趋势&#xff0c;特别是HarmonyOS NEXT版本将进入独立生态体系&#xff0c;不再兼容安卓应用&#xff0c;在开发者和各个企业间激起了不小…

Reqable爬虫抓包工具(国产网络调试工具)

官网界面截图&#xff1a; 官网地址&#xff1a;https://reqable.com/zh-CN/windows/ 历史由来&#xff1a; Reqable的前身是HttpCanary&#xff08;一款Android平台应用程序&#xff09;&#xff0c;但是国内开发者推翻了所有的技术栈&#xff0c;并用C和Flutter重写&#x…

指纹芯片系列——ACM32FP0 二合一(主控+TK)锁控芯片,ACM32FP4三合一(主控+算法+语音)等介绍

随着智能设备的持续发展&#xff0c;指纹识别技术成为了现在智能终端市场和移动支付市场中占有率最高的生物识别技术。凭借高识别率、短耗时等优势&#xff0c;被广泛地运用在智能门锁、智能手机、智能家居等设备上。 我们推荐的在2015年进入指纹识别应用领域&#xff0c;自研高…

数据结构——lesson7二叉树 堆的介绍与实现

前言&#x1f49e;&#x1f49e; 啦啦啦~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;数据结构学习笔记 &#x1f4a5;对于数据结构顺序表链表有疑问的都可以在上面数据结…

开发Chrome扩展插件

1.首先开发谷歌chrome扩展插件&#xff0c;没有严格的项目结构目录&#xff0c;但是需要保证里面有一个mainfest.json文件 (必不可少的文件)。在这个文件里有三个属性必不可少&#xff1a;name、version、mainfest_version&#xff1b; // 清单文件的版本&#xff0c;这个必须写…