在日常开发中常见于生成主键的ID,比较规范好用,详细代码如下(写注释是个好习惯):
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
using System.Web;
namespace MVCDemo.Models.Common
{
public static class UuidHelper
{
[DllImport("rpcrt4.dll", SetLastError = true)]
private static extern int UuidCreateSequential(out Guid guid);
/// <summary>
/// 生成连续的UUID,底层调用了Windows API UuidCreateSequential。经测试发现,
/// UuidCreateSequential,在多CPU并发状态下,有可能会产生重复数据,因此这个方法进行的并发控制,并延迟1毫秒。
/// 另外,UuidCreateSequential的生成和网络连接有关(网卡),如果电脑上插了Windows Mobile的手机,会产生新的网络连接,
/// 导致UuidCreateSequential出错,此时,这个方法将使用传统的Guid来替代Uuid。
/// </summary>
/// <returns>在本机生成连续的Guid</returns>
public static Guid NewUuid()
{
Guid result;
lock (typeof(UuidHelper))
{
int hr = UuidCreateSequential(out result);
if (hr == 0)
result = Guid.NewGuid();
Thread.Sleep(1);
}
return result;
}
/// <summary>
/// 生成连续的UUID,底层调用了Windows API UuidCreateSequential
/// </summary>
/// <returns>在本机生成连续的Guid</returns>
public static string NewUuidString()
{
Guid result = NewUuid();
byte[] guidBytes = result.ToByteArray();
for (int i = 0; i < 8; i++)
{
byte t = guidBytes[15 - i];
guidBytes[15 - i] = guidBytes[i];
guidBytes[i] = t;
}
return new Guid(guidBytes).ToString();
}
}