using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Management; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace Pilz.Cryptography { public class UniquieID : UniquieID { public UniquieID() : base() { } public UniquieID(bool autoGenerate) : base(autoGenerate) { } protected override string GenerateSimple() { return typeof(TargetType).ToString() + base.GenerateSimple(); } protected override string GenerateDefault() { return GenerateUniquieID(string.Empty); } public override int GetHashCode() { return base.GetHashCode(); } public override bool Equals(object obj) { return base.Equals(obj); } #region Statics for Generation private static string GenerateUniquieID(string var) { var sn = TryGetSerialNumberOfFirstHardDrive(); var dateTime = DateTime.UtcNow.ToString("yyyyMMddHHmmssfffffff"); var type = typeof(T).ToString(); var together = sn + dateTime + type + var; var md5 = MD5.Create(); var hash = BitConverter.ToString(md5.ComputeHash(Encoding.Default.GetBytes(together))).Replace("-", string.Empty); md5.Dispose(); return hash; } private static string Win32_PhysicalMedia_SerialNumber = null; private static string TryGetSerialNumberOfFirstHardDrive() { if (Win32_PhysicalMedia_SerialNumber == null) { var searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PhysicalMedia"); var sn = string.Empty; foreach (ManagementObject wmi_HD in searcher.Get()) { if (string.IsNullOrEmpty(sn) && wmi_HD["SerialNumber"] != null) sn = wmi_HD["SerialNumber"].ToString().Trim(); } Win32_PhysicalMedia_SerialNumber = sn; } return Win32_PhysicalMedia_SerialNumber; } #endregion public static implicit operator string(UniquieID id) => id.ID; public static implicit operator UniquieID(string id) => new UniquieID() { ID = id }; public static implicit operator UniquieID(int id) => new UniquieID() { ID = Convert.ToString(id) }; public static bool operator ==(UniquieID left, UniquieID right) => left.ID.Equals(right.ID); public static bool operator !=(UniquieID left, UniquieID right) => !left.ID.Equals(right.ID); } }