FreeSql/FreeSql/FreeUtil.cs

50 lines
1.8 KiB
C#

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<Random> rnd = new ThreadLocal<Random>(() => 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();
/// <summary>
/// 生成类似Mongodb的ObjectId有序、不重复Guid
/// </summary>
/// <returns></returns>
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();
}
}