我需要生成一些字符串,这些字符串在生成的所有机器上都有极高的唯一性概率,并且每次运行代码时都不同。唯一性的概率不必达到100%,这与安全无关,只有唯一性很重要(用例是种子大状态非加密PRNG)。
我的当前想法是SHA512哈希网络适配器信息,包括适配器统计信息、计算机名称、进程ID、计算机正常运行时间和UTC当前时间的刻度,并将其转换为64个字符的基于64的Unicode字符串。
看起来很合理,但是否有更好的方法,例如使用.NET函数?
工作代码:
我的当前想法是SHA512哈希网络适配器信息,包括适配器统计信息、计算机名称、进程ID、计算机正常运行时间和UTC当前时间的刻度,并将其转换为64个字符的基于64的Unicode字符串。
看起来很合理,但是否有更好的方法,例如使用.NET函数?
工作代码:
using System;
using System.Diagnostics;
using System.Net.NetworkInformation;
using System.Security.Cryptography;
using System.Text;
static class UniqueString
{
private static SHA512 sha = SHA512.Create();
public static string Gen()
{
NetworkInterface[] adapters = NetworkInterface.GetAllNetworkInterfaces();
StringBuilder uniqueString = new StringBuilder();
foreach (NetworkInterface adapter in adapters)
{
IPInterfaceStatistics stats = adapter.GetIPStatistics();
uniqueString.AppendFormat("{0} {1} {2} {3} {4} {5} {6} {7} {8} {9} {10} {11} {12} {13} {14} {15} {16} {17} ",
adapter.Description,
adapter.Id,
adapter.Name,
adapter.Speed,
adapter.GetPhysicalAddress(),
adapter.NetworkInterfaceType,
stats.BytesReceived,
stats.BytesSent,
stats.IncomingPacketsDiscarded,
stats.IncomingPacketsWithErrors,
stats.IncomingUnknownProtocolPackets,
stats.NonUnicastPacketsReceived,
stats.NonUnicastPacketsSent,
stats.OutgoingPacketsDiscarded,
stats.OutgoingPacketsWithErrors,
stats.OutputQueueLength,
stats.UnicastPacketsReceived,
stats.UnicastPacketsSent);
}
uniqueString.AppendFormat("{0} {1} {2} {3}",
Environment.MachineName,
Process.GetCurrentProcess().Id,
Environment.TickCount.ToString(),
DateTime.UtcNow.Ticks);
return Convert.ToBase64String(sha.ComputeHash(Encoding.Unicode.GetBytes(uniqueString.ToString())), 0, 48);
}
}
Guid.NewGuid()
是一个在.NET开发中的方法,用于生成唯一标识符(GUID)。 - Dave