Exemplo n.º 1
0
        /// <summary>
        /// Combine appName, CPU ID, Disk C Volume Serial Number and Motherboard Serial Number as device Id
        /// if user_mobile is set, it is first input for device Id
        /// </summary>
        /// <param name="appName"></param>
        /// <param name="user_mobile">if set, it is first input for device Id</param>
        /// <returns></returns>
        public static string GenerateUID(string appName, string user_mobile = null)
        {
            //Combine the IDs and get bytes
            string _id = user_mobile == null?
                         string.Concat(appName, GetProcessorId(), GetMotherboardID(), GetDiskVolumeSerialNumber()) :
                             string.Concat(user_mobile, appName, GetProcessorId(), GetMotherboardID(), GetDiskVolumeSerialNumber());

            byte[] _byteIds = Encoding.UTF8.GetBytes(_id);

            //Use MD5 to get the fixed length checksum of the ID string
            MD5CryptoServiceProvider _md5 = new MD5CryptoServiceProvider();

            byte[] _checksum = _md5.ComputeHash(_byteIds);

            //Convert checksum into 4 ulong parts and use BASE36 to encode both
            string _part1Id = BASE36.Encode(BitConverter.ToUInt32(_checksum, 0));
            string _part2Id = BASE36.Encode(BitConverter.ToUInt32(_checksum, 4));
            string _part3Id = BASE36.Encode(BitConverter.ToUInt32(_checksum, 8));
            string _part4Id = BASE36.Encode(BitConverter.ToUInt32(_checksum, 12));

            //Concat these 4 part into one string
            string uid = string.Format("{0}-{1}-{2}-{3}", _part1Id, _part2Id, _part3Id, _part4Id);

            return(uid);
        }
Exemplo n.º 2
0
        public static byte[] GetUIDInBytes(string UID)
        {
            //Split 4 part Id into 4 ulong
            string[] _ids = UID.Split('-');

            if (_ids.Length != 4)
            {
                throw new ArgumentException("Wrong UID");
            }

            //Combine 4 part Id into one byte array
            byte[] _value = new byte[16];
            Buffer.BlockCopy(BitConverter.GetBytes(BASE36.Decode(_ids[0])), 0, _value, 0, 8);
            Buffer.BlockCopy(BitConverter.GetBytes(BASE36.Decode(_ids[1])), 0, _value, 8, 8);
            Buffer.BlockCopy(BitConverter.GetBytes(BASE36.Decode(_ids[2])), 0, _value, 16, 8);
            Buffer.BlockCopy(BitConverter.GetBytes(BASE36.Decode(_ids[3])), 0, _value, 24, 8);

            return(_value);
        }