当前位置: 首页 > 知识库问答 >
问题:

从命名空间生成UUID?

谷梁智
2023-03-14

尝试基于两个唯一的字符串生成客户端Id。这应该与服务器中从相同的ID生成的UUID相同。

使用Javascript,它看起来像这样:

uuidv5(id1 + id2 , uuidv5.DNS);

似乎找不到在Swift上生成这个的方法,NSUUID只能从无到有生成UUID

NSUUID().uuidString

我正在寻找这样的东西:

NSUUID(namespace: id1 + id2).uuidString

编辑

例:

let sorted = ["5a23dbfb2626b400190998fc", "5pCAvA7h8k9JuErRn"]
let appended = sorted.seperaredStringBy("-")
let result = uuidv5(appended , uuidv5.DNS)

//results:
2522b097-8532-548e-a18b-9366c6511b5e

共有2个答案

岳玉堂
2023-03-14

objc版本,以防有人需要。

objectivec prettyprint-override">+ (CBUUID *)UUIDWithNamespace:(NSString *)namespace name:(NSString *)name version:(int)version
{
    if (namespace.length <= 0 || name == nil  ) { return nil; }
    if (!(version == 3        || version == 5)) { return nil; }
    CBUUID *namespaceUUID = [CBUUID UUIDWithString:namespace];
    if (namespaceUUID == nil) { return nil; }
    NSMutableData *data = [[NSMutableData alloc] init];
    [data appendData:namespaceUUID.data];
    [data appendData:[name dataUsingEncoding:NSUTF8StringEncoding]];
    unsigned char hash[CC_SHA1_DIGEST_LENGTH];
    if (version == 3) {
        CC_MD5(data.bytes, (int)data.length, hash);
    } else if (version == 5) {
        CC_SHA1(data.bytes, (int)data.length, hash);
    }
    unsigned char result[16];
    memcpy(result, hash, 16);
    result[6] &= 0x0F;
    result[6] |= (((unsigned char)version) << 4);
    result[8] &= 0x3F;
    result[8] |= 0x80;
    return [CBUUID UUIDWithData:[NSData dataWithBytes:result length:16]];
}
万嘉石
2023-03-14

据我所知,Swift 标准库或 Foundation 框架没有针对版本 5 UUID 的内置方法。

下面是版本3和版本5 UUID的一个可能的实现,摘自生成v5 UUID的描述。什么是名称和命名空间?以及RFC 4122中的参考实现。

(为Swift 4及更高版本更新)

import Foundation
import CommonCrypto

extension UUID {

    enum UUIDVersion: Int {
        case v3 = 3
        case v5 = 5
    }

    enum UUIDv5NameSpace: String {
        case dns  = "6ba7b810-9dad-11d1-80b4-00c04fd430c8"
        case url  = "6ba7b811-9dad-11d1-80b4-00c04fd430c8"
        case oid  = "6ba7b812-9dad-11d1-80b4-00c04fd430c8"
        case x500 = "6ba7b814-9dad-11d1-80b4-00c04fd430c8"
    }

    init(version: UUIDVersion, name: String, nameSpace: UUIDv5NameSpace) {
        // Get UUID bytes from name space:
        var spaceUID = UUID(uuidString: nameSpace.rawValue)!.uuid
        var data = withUnsafePointer(to: &spaceUID) { [count =  MemoryLayout.size(ofValue: spaceUID)] in
            Data(bytes: $0, count: count)
        }

        // Append name string in UTF-8 encoding:
        data.append(contentsOf: name.utf8)

        // Compute digest (MD5 or SHA1, depending on the version):
        var digest = [UInt8](repeating: 0, count:Int(CC_SHA1_DIGEST_LENGTH))
        data.withUnsafeBytes { (ptr: UnsafeRawBufferPointer) -> Void in
            switch version {
            case .v3:
                _ = CC_MD5(ptr.baseAddress, CC_LONG(data.count), &digest)
            case .v5:
                _ = CC_SHA1(ptr.baseAddress, CC_LONG(data.count), &digest)
            }
        }

        // Set version bits:
        digest[6] &= 0x0F
        digest[6] |= UInt8(version.rawValue) << 4
        // Set variant bits:
        digest[8] &= 0x3F
        digest[8] |= 0x80

        // Create UUID from digest:
        self = NSUUID(uuidBytes: digest) as UUID
    }
}

示例1(您的案例):

let uuid = UUID(version: .v5, name: "5a23dbfb2626b400190998fc-5pCAvA7h8k9JuErRn", nameSpace: .dns)
print(uuid) // 2522B097-8532-548E-A18B-9366C6511B5E

示例2(来自RFC 4122的附录B,在勘误表中进行了更正):

let uuid = UUID(version: .v3, name: "www.widgets.com", nameSpace: .dns)
print(uuid) //3D813CBB-47FB-32BA-91DF-831E1593AC29
 类似资料:
  • 我试图找到一种使用Azure管理API、cmdlet或REST API创建Azure Servicebus命名空间的方法,以便可以为部署创建可重复的脚本。目前,我知道如何创建Servicebus命名空间的唯一方法是通过Azure门户。 是否有一种可编写脚本(c#,powershell)的方法来使用azure门户创建新的azure servicebus w/o? 这里有一些我已经读过的链接: Azu

  • 我有两套XSD,一套用于入站操作,另一套用于出站操作。这两个XSD集具有相似的名称空间,但由于它们来自不同的源,因此需要在同一代码集中分别维护它们。每个XSD集合都有深度嵌套的类,并生成大约650个类。我正在使用Maven JAXB插件生成Java类 如果我指定了

  • 我目前正在使用JAXB使用Mojo Maven插件'jaxb2-maven-plugin'生成的类为我们的Netbeans平台应用程序实现功能。不幸的是,XSD文件的创建不在我手中,它们是机密的。我试图提供一个最小的运行示例来进一步证明这一点,但现在我希望有人可以仅从我的描述中将我推向正确的方向。 我们有很多XSD文件,在过去的几周里得到了一些补充。其中两个XSD(我们称之为A.xsd和B.xsd

  • 我在Visual Studio中从第三方WSDL添加了一个服务引用,但它不是创建代理类,而是创建一个具有空名称空间的文件: WSDL地址是http://wwwh.cnj.jus.br/sgt/sgt_ws.php?WSDL 我该怎么修好它? 更新: 我运行了命令

  • 我已经阅读了man页面,但我不明白name和namespace是用来做什么的。 对于版本3和版本5的UUID,必须给出额外的命令行参数命名空间和名称。命名空间要么是字符串表示中的UUID,要么是内部预定义命名空间UUID的标识符(目前已知的是“ns: DNS”、“ns: URL”、“ns: OID”和“ns: X500”)。名称是任意长度的字符串。 命名空间: 命名空间可以是字符串表示形式的UUI

  • 我在tomcat服务器上部署了一个web服务,并为其生成了一个wsdl文件。 后来,我通过wsdl生成了一个新的soap项目,并对服务器执行了一个soap请求。 这里的问题是在服务器端,xml的解组失败,因为“输入数据”和“CCNA”的命名空间前缀是错误的。目前是cfa。 根据java代码,InputData的命名空间是xs,CCNA是bim。所以,如果我修改了soap请求,服务器端的解组就可以了