Генерация UUID на основе строк - PullRequest
0 голосов
/ 17 апреля 2020

Как сгенерировать детерминированность c GUID / UUID v3 / v5 в C#, имеющие как пространство имен, так и имя в виде строк (в соответствии с RFC4122 вам необходимо предоставить пространство имен в виде GUID и имя в виде строки) для функции, поэтому я хотел бы предоставить две строки вместо guid для пространства имен и строку для имени и всегда иметь одинаковый GUID / UUID для строки для пространства имен и для строки для имени. Является ли хеширование namespace string с MD5 / SHA1 и делает новый конструктор Guid by Guid (byte []) безопасным способом для выполнения sh этого, чтобы я мог дополнительно предоставить его для работы? Я НЕ спрашиваю о синтаксическом анализе guid-a-like-строки в пространстве имен с помощью Guid.TryParse (), но преобразую любую строку в пространство имен guid, чтобы дополнительно обеспечить ее для функции ниже, но она также имеет определенную c. В соответствии с https://github.com/Faithlife/FaithlifeUtility/blob/master/src/Faithlife.Utility/GuidUtility.cs и RF C 4122 вы должны создать GUID, используя пространство имен GUID и имя строки / любую строку.

        /// <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);
    }

BUMP ..

...