如何把GUID转换为整形INT数值
十二.23, 2008 in
.NET
在前面一篇介绍在测试过程中创建唯一数据的文章中,推荐使用GUID作为生成唯一测试数据的方法,本人在测试过程中碰到一个问题,就是对于电话号码的生成,如何使得生成的数据尽可能地达到不重复。C#库里面有一个类-Random,这个类可以帮助开发者或者测试员生成随机数,但是大家都知道,计算机生成的随机数准确来说是伪随机数。本人曾经做过一个小实验,用当前时间作为随机种子,创建1000个随机数,里面重复值是相当多。
沿用前一篇文章的思想,我想把GUID转换为整数,那么应该怎么做呢?在程序内部,GUID也是可以看作是一个整数形式存在的变量,当要做这样子的转换的时候,需要了解的是转换会带来信息的丢失;就好像把一个long转换为一个int,有时候会有信息的丢失。我们可以容忍这个丢失,因为从实践来看,用GUID转成int,比Random类生成随机数好随机的多。以下是如何把GUID转换为int的一个方法:
1 2 3 | Guid tempGuid = Guid.NewGuid(); byte[] bytes = tempGuid.ToByteArray(); int i = Math.Abs(((int)bytes[0]) | ((int)bytes[1] << 8) | ((int)bytes[2] << 16) | ((int)bytes[3] << 24)); |
这样就可以生成一个正整数了。
经过兄弟的留言,C#下其实根本不用那样子折腾
1 | int i = Math.Abs(Guid.NewGuid().GetHashCode()); |
Related posts:

一月 6th, 2009 at 01:13
直接取 guid的 hashcode 就好了 你这么写不会比哈希的散列分布更好
一月 6th, 2009 at 11:57
@兄弟, 谢谢提醒
二月 3rd, 2009 at 13:55
Guid改成HashCode就不能保证其唯一性了。
用hashcode就是讨厌这个地方,不同guid生成的Hashcode有可能是一样的,也就是冲突了。
比如:bd8932f2-3e53-43c1-bea7-2cebc9269ef3 和 6734397d-7fee-48da-84e2-b7e661abee67 的hashcode都是-1344638528
Dictionary hashDic = new Dictionary();
for (int i = 0; i < 1000000; i++)
{
Guid guid = Guid.NewGuid();
int guidHashCode = guid.GetHashCode();
if (hashDic.ContainsKey(guidHashCode))
Trace.WriteLine(“Has the Same HashCode: ” + guidHashCode.ToString() + “|” + guid.ToString() + “|” + hashDic[guidHashCode].ToString());
else
hashDic.Add(guidHashCode,guid);
}
1000000个里面大概能赶上110多个会重复,看需求了,呵呵
二月 3rd, 2009 at 21:43
@xinwei, 1000000个里面大概能赶上110多个会重复,不错啦O(∩_∩)O