【发布时间】:2018-11-24 18:50:50
【问题描述】:
我需要生成的字符串在生成它们的所有机器上具有极高概率是唯一的,并且每次运行代码时都不同。唯一性的概率不必是 100%,这与安全性无关,只有唯一性很重要(用例是播种大型状态非加密 PRNG)。
我目前的想法是对网络适配器信息进行 SHA512 哈希处理,包括适配器统计信息、计算机名称、进程 ID、计算机运行时间(以滴答为单位)和 UTC 当前时间(以滴答为单位),并将其转换为 64 个字符的 base 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()? -
想过这个问题,但是这台机器独有的概率是多少?
-
极高。
-
这里是关于 GUID 和冲突可能性的一个很好的答案 stackoverflow.com/a/2977648/6915929
-
不要将 GUID 用于生成唯一标识符之外的任何事情。不能保证指南是随机性的良好来源。 如果您需要良好的随机性来源,请使用专门设计用于解决该问题的类,而不是使用 Guid 作为解决该问题的代理!
标签: c# uniqueidentifier