首页 > 其他分享 >ULID(Universally Unique Lexicographically Sortable Identifier)是一种用于生成全局唯一、可按字典序排序的标识符的格式。ULID结合了时间戳和

ULID(Universally Unique Lexicographically Sortable Identifier)是一种用于生成全局唯一、可按字典序排序的标识符的格式。ULID结合了时间戳和

时间:2024-03-04 10:46:03浏览次数:23  
标签:buffer bitsLeft 生成 ULID 排序 标识符

ULID(Universally Unique Lexicographically Sortable Identifier)是一种用于生成全局唯一、可按字典序排序的标识符的格式。ULID结合了时间戳和随机数的特性,旨在提供高性能、低碰撞、可排序和易读的标识符。

ULID的主要特点包括:

  1. 全局唯一性:通过结合时间戳和随机数的方式,ULID可以生成全局唯一的标识符,避免了碰撞的可能性。
  2. 按字典序排序:ULID生成的标识符是按照时间戳先后顺序排列的,可以方便地进行排序和比较。
  3. 性能优化:ULID的设计旨在提供高性能的生成过程,适用于需要频繁生成标识符的场景。
  4. 可读性:ULID采用了基于Crockford's Base32编码的方式,生成的标识符具有一定的可读性,不同于传统的UUID。

ULID的格式通常由 48 位长度组成,其中包含前缀时间戳和随机数部分。ULID的生成过程包括获取当前时间戳(以毫秒为单位)、生成随机数部分、将时间戳和随机数合并,并进行Base32编码等步骤。

为什么使用ULID:

  • 全局唯一性:ULID生成的标识符在分布式系统中具有全局唯一性,可以避免碰撞风险。
  • 排序能力:ULID生成的标识符可以按照时间戳顺序排序,方便数据库索引和查询操作。
  • 性能优化:ULID的设计考虑了高性能的生成过程,适用于需要频繁生成标识符的场景。
  • 可读性:ULID生成的标识符相对于传统的UUID更具可读性,便于人类阅读和理解。

 ULID作为一种全局唯一、可排序、高性能的标识符生成方案,适用于分布式系统、数据库主键、日志记录等各种场景,为应用程序提供了一种轻量级且有效的标识符生成方式。


在 PowerShell 中,你可以使用以下命令生成 Windows 的 ULID(Universally Unique Lexicographically Sortable Identifier):

powershellCopy Code
Add-Type -TypeDefinition @"
using System;

public class Ulid
{
    private static readonly DateTime UnixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    private static readonly Random Random = new Random();

    public static string NewUlid()
    {
        byte[] random = new byte[10];
        Random.NextBytes(random);
        long milliseconds = (DateTime.UtcNow - UnixEpoch).Ticks / 10000;
        byte[] time = BitConverter.GetBytes(milliseconds);

        Array.Reverse(time);
        byte[] ulidBytes = new byte[16];
        Buffer.BlockCopy(time, 2, ulidBytes, 0, 6);
        Buffer.BlockCopy(random, 0, ulidBytes, 6, 10);

        return EncodeBase32(ulidBytes);
    }

    private static string EncodeBase32(byte[] data)
    {
        const string base32Chars = "0123456789ABCDEFGHJKMNPQRSTVWXYZ";
        const int size = 13;
        var sb = new System.Text.StringBuilder(size);
        int buffer = data[0];
        int next = 1;
        int bitsLeft = 8;
        while (bitsLeft > 0 || next < data.Length)
        {
            if (bitsLeft < 5)
            {
                if (next < data.Length)
                {
                    buffer <<= 8;
                    buffer |= data[next++] & 0xFF;
                    bitsLeft += 8;
                }
                else
                {
                    int pad = 5 - bitsLeft;
                    buffer <<= pad;
                    bitsLeft += pad;
                }
            }
            int index = 0x1F & (buffer >> (bitsLeft - 5));
            bitsLeft -= 5;
            sb.Append(base32Chars[index]);
        }
        return sb.ToString();
    }
}
"@

[Ulid]::NewUlid()

运行以上 PowerShell 命令,将会生成一个 ULID 格式的字符串作为输出。这个 ULID 是根据当前时间和随机数生成的全局唯一标识符,符合 ULID 格式规范。


PowerShell 中,注册表路径应该使用根键的名称来指定,而不是直接指向文件系统路径。

尝试使用以下命令来获取 MachineGuid 的值:

powershellCopy Code
Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Cryptography" | Select-Object -Property MachineGuid

这条命令中,我们将注册表路径改为 HKLM:\SOFTWARE\Microsoft\Cryptography,并使用 Get-ItemProperty 命令来获取 MachineGuid 的值。这样应该就能成功读取注册表中的 MachineGuid 值了。


需要生成 48 位长度的 Windows ULID,可以使用以下 PowerShell 脚本:

powershellCopy Code
function New-Ulid {
    $base32Chars = "0123456789ABCDEFGHJKMNPQRSTVWXYZ"

    $timeBytes = [BitConverter]::GetBytes([DateTime]::UtcNow.Ticks)
    $randomBytes = [byte[]]::new(10)
    [System.Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($randomBytes)

    $ulidBytes = $timeBytes[6..11] + $randomBytes

    $sb = [System.Text.StringBuilder]::new()
    $buffer = $ulidBytes[0]
    $next = 1
    $bitsLeft = 8

    while ($bitsLeft -gt 0 -or $next -lt 16) {
        if ($bitsLeft -lt 5) {
            if ($next -lt 16) {
                $buffer = $buffer -shl 8
                $buffer = $buffer -bor $ulidBytes[$next]
                $next += 1
                $bitsLeft += 8
            } else {
                $pad = 5 - $bitsLeft
                $buffer = $buffer -shl $pad
                $bitsLeft += $pad
            }
        }
        $index = 0x1F -band ($buffer -shr ($bitsLeft - 5))
        $bitsLeft -= 5
        $sb.Append($base32Chars[$index])
    }

    return $sb.ToString()
}

New-Ulid

请尝试在 PowerShell 中运行这段代码,它将生成一个符合 ULID 规范的 48 位长度的 Windows ULID 字符串。


 

标签:buffer,bitsLeft,生成,ULID,排序,标识符
From: https://www.cnblogs.com/suv789/p/18051332

相关文章

  • Qt表格排序例子
    表格排序是Qt内建支持的,用起来很简单。只需要在QtCreator界面给QTableView或QTableWidget的SortingEnabled属性设置为true就行了。本文将对这两种控件分别展示一下效果和一个自定义的排序例子。一、QTableWidget这个不需要任何代码,只需要设计界面时候启用排序就行了。下面直接......
  • 147. 对链表进行插入排序(中)
    目录题目题解优化题目给定单个链表的头head,使用插入排序对链表进行排序,并返回排序后链表的头。插入排序算法的步骤:插入排序是迭代的,每次只移动一个元素,直到所有元素可以形成一个有序的输出列表。每次迭代中,插入排序只从输入数据中移除一个待排序的元素,找到它在......
  • 力扣80.删除排序数组中的重复项 II
    题目:给你一个有序数组nums,请你删除重复出现的元素,使得出现次数超过两次的元素只出现两次,返回删除后数组的新长度。实现方法:使用map计数,用快慢指针方法,快指针不断加一,慢指针在计数小于出现次数时加一,再将快指针指向的数赋给慢指针指向的数。funcremoveDuplicates(nums......
  • 第十一届蓝桥杯试题E:排序
    目录题目分析验证代码题目对一个字符串,对它进行冒泡排序使其为升序,例如:对于lan,排序成aln需要交换一次(只能交换相邻的两个字母),对于qiao,排序成aioq就需要交换4次。请找出冒泡排序时恰好需要交换100次的字符串,如果有多个字符串满足条件,则找出最短的那个,如果有多个满足条件而且......
  • 快速排序
    1.概念快速排序算法是对冒泡排序算法的一种改进算法,在当前所有内部排序算法中,快速排序算法被认为是最好的排序算法之一。2.基本思想快速排序的基本思想:通过一趟排序将待排序的序列分割为左右两个子序列,左边的子序列中所有数据都比右边子序列中的数据小,然后对左右两个子序列继......
  • 算法-2.内排序
    2.内排序2.1三种代价为Θ(n2)排序算法2.1.1插入排序※最佳时间代价Θ(n),平均、最差时间代价均为Θ(n2)1template<classElem>23voidswap(ElemA[],inta,intb){45inttemp;67temp=A[a];89A[a]=A[b];1011A[b]=temp;1......
  • 【C++】相对于数组,在链表中添加和删除元素更容易,但排序速度更慢。这就引出了一种可能
    相对于数组,在链表中添加和删除元素更容易,但排序速度更慢。这就引出了一种可能性:相对于使用链表算法进行排序,将链表复制到数组中,对数组进行排序,再将排序后的结果复制到链表中的速度可能更快;但这也可能占用更多的内存。请使用如下方法检验上述假设。a.创建大型vector<int>对象vi0,并......
  • Vue学习笔记21-列表排序
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>列表排序</title><script......
  • 只有 2G 内存, 如何排序 128G 数据?
    【外排序】只有2G内存,如何排序128G数据?在说明这个问题之前,先来回顾一项计组基础知识:CPU最多可以访问到内存,无法访问磁盘;因此一般的排序算法(如快速/归并/堆/希尔)都只能对至少可存储在内存中的数据进行排序,但现在需要面对的场景是数据量过大,无法放入内存,因......
  • AI与人类联手,智能排序人类决策:RLHF标注工具打造协同标注新纪元,重塑AI训练体验
    AI与人类联手,智能排序人类决策:RLHF标注工具打造协同标注新纪元,重塑AI训练体验在大模型训练的RLHF阶段,需要人工对模型生成的多份数据进行标注排序,然而目前缺乏开源可用的RLHF标注平台。RLHF标注工具是一个简单易用的,可以在大模型进行RLHF(基于人类反馈的强化学习)标注排序的......