我怎样才能为一个字符串生成一个GUID?
我在为字符串生成GUID时遇到问题 - 例如:
Guid g = New Guid("Mehar");
我如何计算"Mehar"
的GUID? 我收到一个例外。
这个线程相当老,但这是我们如何解决这个问题:
由于.NET框架中的Guid是任意16字节或128位,因此可以通过将任何散列函数应用于生成16字节散列的字符串并随后将结果传递给Guid构造函数,从而计算任意字符串的Guid。
我们决定使用MD5哈希函数,示例代码如下所示:
string input = "asdfasdf";
using (MD5 md5 = MD5.Create())
{
byte[] hash = md5.ComputeHash(Encoding.Default.GetBytes(input));
Guid result = new Guid(hash);
}
请注意,这个Guid代自身有一些缺陷,因为它取决于散列函数的质量! 如果您的散列函数为您使用的大量字符串生成相同的散列值,将会影响软件的行为。
下面是一个最常用的散列函数列表,它产生一个128位的摘要:
请注意,也可以使用其他散列函数,它们会生成更大的摘要并简单地截断这些函数。 因此使用更新的散列函数可能很明智。 列出一些:
今天(2013年8月),160位SHA1哈希算是一个不错的选择。
我相当肯定你已经混淆了System.Guid
与给定字符串的散列(比如SHA-256)。
请注意,选择密码安全散列算法时,MD5,SHA0和SHA1通常都被认为是无效的。 SHA2及以上仍然可用。
您正在寻找的可能是生成版本3或版本5的UUID,这是基于UUID的名称。 (建议使用版本5)。 我不认为.NET框架已经支持它。 请参阅http://en.wikipedia.org/wiki/Universally_Unique_Identifier
我做了几次谷歌搜索,看看能否在Win32 API中找到某些东西,但没有出现。 不过,我相信.NET框架有一些隐藏的地方,因为据我所知,当在.NET中生成一个COM对象,并且你没有提供一个明确的GUID时,那么.NET框架会生成一个名称基于UUID来创建一个定义明确的ClassID和InterfaceID,即每次重新编译时都不会改变的UUID(如VB6)。 但是这可能是隐藏的,所以我想你需要自己实现算法。 幸运的是,.NET提供了MD5和SHA1算法,所以我不认为实现版本3和版本5 UUID应该太难了。
链接地址: http://www.djcxy.com/p/91433.html