从相同的字符串生成相同的UUID

2024-01-12

我想从随机字符串生成一个UUID字符串,以便相同的输入字符串生成相同的UUID。

我不关心从 UUID 获取输入字符串。作为迁移的一部分,我需要它来确定性地转换数据库中的密钥,以便并行操作的不同客户端收敛到相同的结果。

接受的答案这个帖子 https://stackoverflow.com/questions/29059530/is-there-any-way-to-generate-the-same-uuid-from-a-string有 Java 的答案,我需要 Swift 版本。


执行此操作的官方方法是使用版本 5 UUID (RFC 4122 第 4.3 节 https://www.rfc-editor.org/rfc/rfc4122#section-4.3):

4.3 创建基于名称的 UUID 的算法

版本 3 或 5 UUID 用于从“名称”生成 UUID 它们是从某些“名称空间”中提取出来的,并且在某些“名称空间”中是唯一的。

该过程是对字符串进行哈希处理,然后将其插入到 UUID 中。我将仔细遵循这里的规范,但我会标记您可以忽略的部分,它仍然可以正常工作。

正如 Matt 指出的,如果您只需要哈希值,则可以直接使用 SHA。但如果您的系统确实需要 UUID,则可以这样做。

  • 定义一个命名空间(这不是完全必要的,但它将确保您的 UUID 是全局唯一的):
let namespace = "com.example.mygreatsystem:"
  • 将其与你的字符串结合起来
let inputString = "arandomstring"
let fullString = namespace + inputString
  • 对值进行哈希处理。 UUID v5 规范特别要求使用 SHA-1,但请随意在此处使用 SHA-256 (SHA-2)。此处使用 SHA-1 并没有实际的安全问题,但只要有可能,最好迁移到 SHA-2。
import CryptoKit

let hash = Insecure.SHA1.hash(data: Data(fullString.utf8)) // SHA-1 by spec

or

let hash = SHA256.hash(data: Data(fullString.utf8)) // SHA-2 is generally better
  • 取数据的前 128 位。 (从 SHA-1 或 SHA-2 哈希中提取任何位子集都是安全的。每个位都是“有效随机的”。)
var truncatedHash = Array(hash.prefix(16))
  • 正确设置版本和变体位。这对于大多数用途来说并不重要。我从未遇到过真正解析 UUID 元数据的系统。但这是规范的一部分。如果您使用 v4 随机 UUID 来记录未来的记录(这是当今几乎每个系统的“正常”UUID),那么这将允许您区分哪些是通过散列创建的,哪些是随机的(如果这出于任何原因而重要)。看UUID工具 https://www.uuidtools.com/decode对该格式有一个很好的视觉介绍。
truncatedHash[6] &= 0x0F    // Clear version field
truncatedHash[6] |= 0x50    // Set version to 5

truncatedHash[8] &= 0x3F    // Clear variant field
truncatedHash[8] |= 0x80    // Set variant to DCE 1.1
  • 最后,计算您的 UUID:
let uuidString = NSUUID(uuidBytes: truncatedHash).uuidString
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从相同的字符串生成相同的UUID 的相关文章

  • 如何在Python中的正则表达式中匹配字符串列表中的任何字符串?

    假设我有一个字符串列表 string lst fun dum sun gum 我想创建一个正则表达式 在其中的某个点 我可以匹配该列表中的任何字符串 在一个组内 如下所示 import re template re compile r el
  • 如何使用存储在 Cocoa Touch 框架中的 Localized.strings?

    我想为 CocoaTouch 框架添加多语言支持 问题 可本地化的字符串我创建的文件仅被使用NSLocalizedString当它是主应用程序及其目标的一部分时 我想将其存储在框架内以将事物分开 我怎样才能使用可本地化的字符串当放置在 Co
  • Cordova iOS 启动画面

    我无法让闪屏停留在页面加载之前 我已经阅读了谷歌搜索第一页 第二页和第三页中的所有条目 我阅读了 stackoverflow 上发布的所有问题 包括一个很好的解释 https stackoverflow com questions 1800
  • 在 SwiftUI 中,如何执行手势但将手势转发到其后面的视图?

    我正在创建一个工具提示系统 如果用户触摸工具提示之外的任何地方 我想关闭工具提示 我希望这样在工具提示之外的触摸既可以消除工具提示 又可以激活用户点击的任何控件 因此 您可以打开一个工具提示 然后仍然单击工具提示外部的按钮 并在第一次点击时
  • 使用 Swift 创建 NSAlert

    我有在 Objective C 中创建和 NSAlert 的代码 但我现在想在 Swift 中创建它 该警报旨在确认用户想要删除文档 我想要 删除 按钮来运行删除功能 而 取消 按钮只是为了消除警报 我怎样才能用 Swift 写这个 NSA
  • 具有透明背景的 Swift 模态视图控制器 [重复]

    这个问题在这里已经有答案了 我知道这个话题很受欢迎 但我在编程语言中遇到了一些问题 事实是我仍然不明白我把代码放在哪里 好吧 我就来说说整个案子 我正在尝试制作一个与正常情况稍有不同的模态 Swift 通过单击按钮 ViewControll
  • 如何从Python列表中的字符串中删除双引号?

    我正在尝试在字典列表中获取一些数据 数据来自 csv 文件 因此都是字符串 文件中的键都有双引号 但由于这些都是字符串 我想删除它们 这样它们在字典中看起来像这样 key value 而不是这个 key value 我尝试简单地使用 str
  • Apple 针对 http 直播流媒体应用程序的政策

    这里有要求 http developer apple com library ios documentation NetworkingInternet Conceptual StreamingMediaGuide UsingHTTPLive
  • 如何快速防止标签中出现孤儿?

    我有一个可以有一两行的标签 如果它有两行 我希望第二行至少有两个 或者可能三个 单词 而不仅仅是一个 关于如何使用 swift 实现这一点有什么想法吗 提前致谢 Daniel 编辑 我删除了我愚蠢的第一个想法 这些想法并没有真正的帮助 好吧
  • Mapkit 在 IOS 13 中使用过多的 CPU

    最近 在一些用户更新到 iOS 13 x 后 我的 iOS 应用程序开始频繁崩溃 在 iOS 12 x 中没有出现该问题 我正在使用 Mapkit 渲染一些 MKPolygons 和 MKPolylines MKPolylines 被删除并
  • 在 UIView 中绘制彩色文本 -drawRect: 方法

    我正在尝试在我的中绘制彩色文本UIView子类 现在我正在使用单视图应用程序模板 用于测试 除了以下内容外 没有任何修改drawRect method 文本已绘制 但无论我将颜色设置为什么 它始终是黑色的 void drawRect CGR
  • 以编程方式检测应用程序是否正在设备或模拟器上运行

    我想知道我的应用程序在运行时是在设备还是模拟器上运行 有没有办法检测到这一点 原因是用模拟器测试蓝牙 api http volcore limbicsoft com 2009 09 iphone os 31 gamekit pt 1 woo
  • 无法识别的选择器调用静态 iOS 库中的类别方法

    我正在使用一些第三方软件来帮助使用 Xcode 4 3 2 编写 iPad 应用程序 该软件是开源的 通常经过设置 因此其代码将与开发人员为应用程序编写的任何代码一起编译 因为我在很多地方使用该软件 所以我决定将其构建为 iOS 模拟器的静
  • TableView 中图像的大小不正确

    我正在使用来自 URL 的图像创建一个表视图 但图像不会调整到所有视图的大小 直到我将其按入行中 知道为什么会发生这种情况吗 这是一个自定义的表格视图 我的代码是 UITableViewCell tableView UITableView
  • Xamarin.Forms DataTemplateSelector 不适用于 iOS(未调用构造函数)

    我正在膨胀数据模板选择器 如下所示
  • 禁用 iPhone 4S / 新 iPad 键盘上的听写按钮

    我们的应用程序是一个医疗保健应用程序 我们的应用程序中有一个符合 HIPAA 标准的语音识别器 所有听写都可以通过它进行 医院不希望医生意外开始与不符合 HIPAA 标准的 Nuance Dragon 服务器进行对话 因此 我正在寻找可以抑
  • 如何在 C++ 中将 CString 转换为 double?

    我如何转换CString to a double在 C 中 Unicode 支持也很好 Thanks A CString可以转换为LPCTSTR 这基本上是一个const char const wchar t 在 Unicode 版本中 知
  • ArraySlice 中的 Swift [重复]

    这个问题在这里已经有答案了 在数组上使用 prefix 方法后 我得到了所谓的 arraySlice 我怎样才能将其转换为数组 我试图从 FacebookGraphApi 获取 Ints 然后请求前 3 个 前缀 3 并尝试将它们添加到新数
  • 如何在运行仅 iPhone 应用程序(非通用)的 iPad 上的 UIPickerView 中支持 VoiceOver?

    一般来说 我会查看 Apple 的 UICatalog 示例代码以获取基本的 VoiceOver 支持 但示例代码中似乎有对 UIPickerViews 的 VoiceOver 支持 我是否需要在某处提供accessibilityLabel
  • 防止点击 MKAnnotation 时检测到 MKMapView 上的触摸事件

    我有一个 UITapGestureRecognizer 当用户点击地图时 它将在我的 MKMap 上隐藏和显示工具栏 简单 但是 当用户点击 MKMapAnnotation 时 我不希望地图以正常方式响应点击 如上所述 此外 当用户点击地图

随机推荐