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