根据字符串生成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 的相关文章

  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 如何填充 ToolStripComboBox?

    我发现它很难将数据绑定到ToolStripComboBox 好像没有这个ValueMember and DisplayMember特性 怎么绑定呢 访问toolstripcombobox中包装的组合框并访问其ValueMember Disp
  • 函数参数的默认参数是否被视为该参数的初始值设定项?

    假设我有这样的函数声明 static const int R 0 static const int I 0 void f const int r R void g int i I 根据 dcl fct default 1 如果在参数声明中指
  • 为什么在 WebApi 上下文中在 using 块中使用 HttpClient 是错误的?

    那么 问题是为什么在 using 块中使用 HttpClient 是错误的 但在 WebApi 上下文中呢 我一直在读这篇文章不要阻止异步代码 https blog stephencleary com 2012 07 dont block
  • 查看 NuGet 包依赖关系层次结构

    有没有一种方法 文本或图形 来查看 NuGet 包之间的依赖关系层次结构 如果您使用的是新的 csproj 您可以在此处获取所有依赖项 在项目构建后 项目目录 obj project assets json
  • 使用可变参数包类型扩展的 C++ 函数调用者包装器

    我绑定了一些 API 并且绑定了一些函数签名 如下所示 static bool WrapperFunction JSContext cx unsigned argc JS Value vp 我尝试将对象和函数包装在 SpiderMonkey
  • 告诉 Nancy 将枚举序列化为字符串

    Nancy 默认情况下在生成 JSON 响应时将枚举序列化为整数 我需要将枚举序列化为字符串 有一种方法可以通过创建来自定义 Nancy 的 JSON 序列化JavaScript 原始转换器 https github com NancyFx
  • 使用valgrind进行GDB远程调试

    如果我使用远程调试gdb我连接到gdbserver using target remote host 2345 如果我使用 valgrind 和 gdb 调试内存错误 以中断无效内存访问 我会使用 target remote vgdb 启动
  • 在视口中查找 WPF 控件

    Updated 这可能是一个简单或复杂的问题 但在 wpf 中 我有一个列表框 我用一个填充数据模板从列表中 有没有办法找出特定的数据模板项位于视口中 即我已滚动到其位置并且可以查看 目前我连接到了 listbox ScrollChange
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 在屏幕上获取字符

    我浏览了 NCurses 函数列表 似乎找不到返回已打印在屏幕上的字符的函数 每个字符单元格中存储的字符是否有可访问的值 如果没有的话Windows终端有类似的功能吗 我想用它来替换屏幕上某个值的所有字符 例如 所有a s 具有不同的特征
  • 使 Guid 属性成为线程安全的

    我的一个类有一个 Guid 类型的属性 该属性可以由多个线程同时读写 我的印象是对 Guid 的读取和写入不是原子的 因此我应该锁定它们 我选择这样做 public Guid TestKey get lock testKeyLock ret
  • WebBrowser.Print() 等待完成。 。网

    我在 VB NET 中使用 WebBrowser 控件并调用 Print 方法 我正在使用 PDF 打印机进行打印 当调用 Print 时 它不会立即启动 它会等到完成整个子或块的运行代码 我需要确保我正在打印的文件也完整并继续处理该文件
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • 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对于命名空间和名称字符串 并且