Example #1
0
        public static Guid Create(Guid @namespace, byte[] name, GuidVersion version)
        {
            var namespaceBytes = @namespace.ToBigEndianByteArray();

            byte[] hash;
            using (var algorithm = version == GuidVersion.NameBasedMd5 ? MD5.Create() : SHA1.Create() as HashAlgorithm)
            {
                algorithm.TransformBlock(namespaceBytes, 0, namespaceBytes.Length, null, 0);
                algorithm.TransformFinalBlock(name, 0, name.Length);
                hash = algorithm.Hash;
            }

            var guidBytes = new byte[16];

            Array.Copy(hash, 0, guidBytes, 0, 16);
            GuidUtility.EndianSwap(guidBytes);

            //Variant RFC4122
            guidBytes[8] = (byte)((guidBytes[8] & 0x3F) | 0x80);//big-endian octet 8

            //Version
            guidBytes[7] = (byte)((guidBytes[7] & 0x0F) | ((int)version << 4));//big-endian octet 6

            return(new Guid(guidBytes));
        }