根据字符串生成UUID

2023-12-20

如何在 C# 中生成确定性 GUID/UUID v3/v5,将命名空间和名称都作为字符串(根据 RFC4122,您需要提供命名空间作为 GUID,名称作为字符串)提供给函数,所以我想提供两个字符串而不是 guid对于命名空间和名称字符串,并且对于命名空间字符串和名称字符串始终具有相同的 GUID/UUID。 正在散列名称空间字符串与 MD5/SHA1 并通过 Guid(byte[]) 构造函数创建新的 Guid 是完成此操作的安全方法,因此我可以进一步将其提供给函数? 我不是在询问如何通过 Guid.TryParse() 将类似 guid 的字符串解析为命名空间,而是将任何字符串转换为 guid 命名空间以进一步为下面的函数提供它,但也具有确定性。 根据https://github.com/Faithlife/FaithlifeUtility/blob/master/src/Faithlife.Utility/GuidUtility.cs https://github.com/Faithlife/FaithlifeUtility/blob/master/src/Faithlife.Utility/GuidUtility.cs和 RFC 4122 这就是你应该如何创建 GUIDGUID命名空间和字符串名称/任何字符串。

        /// <summary>
    /// Creates a name-based UUID using the algorithm from RFC 4122 §4.3.
    /// </summary>
    /// <param name="namespaceId">The ID of the namespace.</param>
    /// <param name="nameBytes">The name (within that namespace).</param>
    /// <param name="version">The version number of the UUID to create; this value must be either
    /// 3 (for MD5 hashing) or 5 (for SHA-1 hashing).</param>
    /// <returns>A UUID derived from the namespace and name.</returns>
    public static Guid Create(Guid namespaceId, byte[] nameBytes, int version)
    {
        if (version != 3 && version != 5)
            throw new ArgumentOutOfRangeException(nameof(version), "version must be either 3 or 5.");

        // convert the namespace UUID to network order (step 3)
        byte[] namespaceBytes = namespaceId.ToByteArray();
        SwapByteOrder(namespaceBytes);

        // compute the hash of the namespace ID concatenated with the name (step 4)
        byte[] data = namespaceBytes.Concat(nameBytes).ToArray();
        byte[] hash;
        using (var algorithm = version == 3 ? (HashAlgorithm) MD5.Create() : SHA1.Create())
            hash = algorithm.ComputeHash(data);

        // most bytes from the hash are copied straight to the bytes of the new GUID (steps 5-7, 9, 11-12)
        byte[] newGuid = new byte[16];
        Array.Copy(hash, 0, newGuid, 0, 16);

        // set the four most significant bits (bits 12 through 15) of the time_hi_and_version field to the appropriate 4-bit version number from Section 4.1.3 (step 8)
        newGuid[6] = (byte) ((newGuid[6] & 0x0F) | (version << 4));

        // set the two most significant bits (bits 6 and 7) of the clock_seq_hi_and_reserved to zero and one, respectively (step 10)
        newGuid[8] = (byte) ((newGuid[8] & 0x3F) | 0x80);

        // convert the resulting UUID to local byte order (step 13)
        SwapByteOrder(newGuid);
        return new Guid(newGuid);
    }

不,您的建议无效,因为它从根本上破坏了 UUID 的工作方式。对您的命名空间使用真实的 UUID。

实现此目的的一种方便(且有效)的方法是分层命名空间。首先,使用标准 DNS 命名空间 UUID 加上您的域名来生成根命名空间:

Guid nsDNS = 新 Guid("6ba7b810-9dad-11d1-80b4-00c04fd430c8"); Guid nsRoot = Guid.Create(nsDNS, "myapp.example.com", 5);

然后为您的字符串创建一个命名空间 UUID:

Guid nsFoo = Guid.Create(nsRoot, "Foo", 5);

现在您已准备好将新的 Foo 命名空间 UUID 与单独的名称一起使用:

Guid bar = Guid.Create(nsFoo, "Bar", 5);

这样做的好处是,其他任何人都会获得与您完全不同的 UUID,即使他们的字符串(显然除了域之外)与您的字符串相同,如果您的数据集合并,则可以防止冲突,但它是完全确定性的、逻辑的和自我记录。

(注意:我从未真正使用过 C#,所以如果我的语法略有错误,请随意编辑。无论如何,我认为模式很清晰。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

根据字符串生成UUID 的相关文章

  • 在 LINQ 查询中返回不带时间的日期

    我正在编写一个查询 我想计算按日期联系我们的呼叫中心的次数 看起来很简单 但由于联系日期字段是日期时间字段 我得到了时间 因此当我按联系日期 时间 分组时 每个联系日期实例的计数为 1 所以 我想只按日期分组 而不按时间分组 下面是我用来查
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • C# 中值类型和引用类型有什么区别? [复制]

    这个问题在这里已经有答案了 我知道一些差异 值类型存储在堆栈上 而引用类型存储在托管堆上 值类型变量直接包含它们的值 而引用变量仅包含对托管堆上创建的对象位置的引用 我错过了任何其他区别吗 如果是的话 它们是什么 请阅读 堆栈是一个实现细节
  • 跨多个控件共享事件处理程序

    在我用 C 编写的 Windows 窗体应用程序中 我有一堆按钮 当用户的鼠标悬停在按钮上时 我希望按钮的边框发生变化 目前我有以下多个实例 每个按钮一个副本 private void btnStopServer MouseEnter ob
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 写入和读取文本文件 - C# Windows 通用平台应用程序 Windows 10

    有用 但在显示任何内容之前 您必须在文本框中输入内容 我想那是因为我使用了 TextChanged 事件处理程序 如果我希望它在没有用户交互的情况下显示文本文件的内容 我应该使用哪个事件处理程序 因此 我想在按下按钮时将一些数据写入 C W
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 按字典顺序对整数数组进行排序 C++

    我想按字典顺序对一个大整数数组 例如 100 万个元素 进行排序 Example input 100 21 22 99 1 927 sorted 1 100 21 22 927 99 我用最简单的方法做到了 将所有数字转换为字符串 非常昂贵
  • 使用 LINQ 查找列表中特定类型的第一个元素

    使用 LINQ 和 C 在元素列表中查找特定类型的第一个项目的最短表示法是什么 var first yourCollection OfType
  • 初始化变量的不同方式

    在 C 中初始化变量有多种方法 int z 3 与 int 相同z 3 Is int z z 3 same as int z z 3 您可以使用 int z z 3 Or just int z 3 Or int z 3 Or int z i
  • Laravel - 覆盖模型 ID

    我正在开发电子书管理系统 我使用 UUID 而不是自动递增整数主键 它工作得很好 protected static function boot parent boot static creating function model model
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • 可空属性与可空局部变量

    我对以下行为感到困惑Nullable types class TestClass public int value 0 TestClass test new TestClass Now Nullable GetUnderlyingType
  • char指针或char变量的默认值是什么[重复]

    这个问题在这里已经有答案了 下面是我尝试打印 char 变量和指针的默认值 值的代码 但无法在控制台上看到它 它是否有默认值或只是无法读取 ASCII 范围 include
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 方法参数内的变量赋值

    我刚刚发现 通过发现错误 你可以这样做 string s 3 int i int TryParse s hello out i returns false 使用赋值的返回值是否合法 Obviously i is but is this th
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud

随机推荐

  • Python和MySQL打印结果

    我正在尝试自学 Python 但遇到了障碍 我需要从 MySQL 获取一个字段 但是当我从数据库检索数据时 结果很奇怪 这是我使用的下面的代码 cursor1 db cursor cursor1 execute select djname
  • Node.js 服务器只是不断加载,没有任何结果。

    我一直在尝试让我的服务器正常工作 但是当我发送发布数据时 它只是不断加载并且没有给出任何结果 这是我的 noen js 文件 var http require http var url require url Configure our H
  • 如何更改 Xcode 中 tableView 原型单元格的高度?

    我拖了一个UITableView到我的故事板中 我可以将信息完全插入其中 但为了定制单元 我添加了一个原型单元 当我手动更改它的高度时 模拟器中没有任何变化 对于那些只想在设计时更改行高的人 您可以选择 表视图单元格 然后在 大小 检查器中
  • 在 CSS 中绘制空的内联框?

    我确信这很简单 但我正在尝试画一组小的 空的 inlineHTML 中的框如下所示 span style border 1px solid black span 早些时候 我们制作了简单的 gif 图像 但随着浏览器显示的放大或缩小 图像看
  • 自定义无符号整数限制和翻转

    我目前需要 C 中的特殊数据类型 我需要数据类型是一个可以保存 0 151 之间值的整数 我已经知道我可以限制最小和最大频谱 但我希望它是一个翻转功能而不是限制钳位 有点像无符号整数在达到极限时如何回绕到 0 我不明白的一件事是如何处理溢出
  • 与 ContentEditable 一起使用的所见即所得编辑器是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 这是字面上的缺点的特定于实现的行为吗?

    我正在测试中的代码这个有趣的答案 https stackoverflow com a 6866155 768472 CL USER gt defun literal cons let cons 1 2 incf cdr cons cons
  • 如何强制GTM在中添加标签?

    我已按照以下步骤在我的网站内添加 AdSense 脚本 现在您已将代码转到 GTM 创建一个新标签 提供一个名字 选择自定义 HTML 作为标记模板 将代码复制并粘贴到文本字段中 将触发器设置为在所有页面或您想要投放广告的页面上触发 单击保
  • 如何使 Geolocation API 函数在 localhost file:// 上工作?

    我有这个基本代码来使用 Geolocation API 检索纬度和经度 显示地图 html
  • 如何在 Zeus Web 服务器中为移动用户代理重写 URL?

    我需要将具有移动用户代理的任何人重定向到名为 mobile php 的文件 我的网络托管提供商 Net Registry 使用 Zeus Web 服务器 这是我根据研究编写的脚本 RULE 1 START get the document
  • Shell 和 Exec 形式的 Dockerfile 指令之间的差异

    有什么区别shell and exec表格用于 CMD CMD python my script py arg vs CMD python my script py arg ENTRYPOINT ENTRYPOINT bin main vs
  • 为什么 C++ 运算符 new/delete/variants 不应该出现在头文件中?

    有人可以解释这个 C 编译错误的本质吗 我正在涉足 学习如何重载全局运算符 new delete 及其变体 我读了一篇couple https stackoverflow com questions 13635157 c overload
  • 使用 xmlns 属性将 XSLT 应用于 XML 文档

    我将 XSLT 样式表应用到以下 XML 文件
  • 使用setTimeout绕过IE的长时间运行脚本警告

    我以前问过这个问题 并在网上找到了一些关于这个主题的文章 但我一生都无法弄清楚这一点 我有一组计算模型的 Javascript 函数 但是存在大量循环 导致脚本需要一段时间 约 4 秒 我不介意处理时间 但 IE 会提示警告 因为执行次数太
  • 在 Rails 上的参数 ruby​​ 中使用变量? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我想检查 param key 是否存在并带有变量名 如果存在 我想使用类似 params filenamestring 1 的值 filen
  • Silverlight 4:当内容变得更窄时,StackPanel 不会调整大小

    我正在使用 Silverlight 4 和 Blend 4 我有一个 水平 堆栈面板 其中包括一些文本框和一个按钮 堆栈面板设置为拉伸到内容使用的大小 文本框也可以自动调整大小 当我向文本框添加文本时 文本框大小会增大 堆栈面板也会增大 到
  • 无法使用react-router和webpack-dev-server直接进入动态路由

    启动 webpack dev server 后 我可以直接进入静态路由 例如http localhost 3456 one 但我无法直接转到动态路线 例如http localhost 3456 two 1234 我相信我的 webpack
  • Nuxt:仅在服务器端获取数据

    我使用 Github 的 API 来获取固定存储库的列表 并将调用放入 AsyncData 方法中 以便在第一次渲染时获得该列表 但我刚刚了解到 AsyncData 在服务器端调用一次 然后每次在客户端加载页面时调用 这意味着客户端不再拥有
  • X.509 证书中的专有名称长度限制

    在通用名称字段中 如 OID 2 5 4 3 的 ASN 1 表示法中所定义 限制最多为 64 个字符 如果我们想要一个超过 64 个字符的通用名 有什么办法吗 即使你可以哄骗你的证书生成代码拥有更长的 CN 它也是clients这需要改变
  • 根据字符串生成UUID

    如何在 C 中生成确定性 GUID UUID v3 v5 将命名空间和名称都作为字符串 根据 RFC4122 您需要提供命名空间作为 GUID 名称作为字符串 提供给函数 所以我想提供两个字符串而不是 guid对于命名空间和名称字符串 并且