using FreeSql.Internal.ObjectPool; using System; using System.Collections.Concurrent; using System.Data.Common; using System.Diagnostics; using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; public static class FreeUtil { private static DateTime dt1970 = new DateTime(1970, 1, 1); internal static ThreadLocal rnd = new ThreadLocal(() => new Random()); private static readonly int __staticMachine = ((0x00ffffff & Environment.MachineName.GetHashCode()) + #if NETSTANDARD1_5 || NETSTANDARD1_6 1 #else AppDomain.CurrentDomain.Id #endif ) & 0x00ffffff; private static readonly int __staticPid = Process.GetCurrentProcess().Id; private static int __staticIncrement = rnd.Value.Next(); /// /// 生成类似Mongodb的ObjectId有序、不重复Guid /// /// public static Guid NewMongodbId() { var now = DateTime.Now; var uninxtime = (int)now.Subtract(dt1970).TotalSeconds; int increment = Interlocked.Increment(ref __staticIncrement) & 0x00ffffff; var rand = rnd.Value.Next(0, int.MaxValue); var guid = $"{uninxtime.ToString("x8").PadLeft(8, '0')}{__staticMachine.ToString("x8").PadLeft(8, '0').Substring(2, 6)}{__staticPid.ToString("x8").PadLeft(8, '0').Substring(6, 2)}{increment.ToString("x8").PadLeft(8, '0')}{rand.ToString("x8").PadLeft(8, '0')}"; return Guid.Parse(guid); } public static string Sha1(string str) { var buffer = Encoding.UTF8.GetBytes(str); var data = SHA1.Create().ComputeHash(buffer); var sub = new StringBuilder(); foreach (var t in data) sub.Append(t.ToString("X2")); return sub.ToString(); } }