如何把GUID转换为整形INT数值

在前面一篇介绍在测试过程中创建唯一数据的文章中,推荐使用GUID作为生成唯一测试数据的方法,本人在测试过程中碰到一个问题,就是对于电话号码的生成,如何使得生成的数据尽可能地达到不重复。C#库里面有一个类-Random,这个类可以帮助开发者或者测试员生成随机数,但是大家都知道,计算机生成的随机数准确来说是伪随机数。本人曾经做过一个小实验,用当前时间作为随机种子,创建1000个随机数,里面重复值是相当多。

沿用前一篇文章的思想,我想把GUID转换为整数,那么应该怎么做呢?在程序内部,GUID也是可以看作是一个整数形式存在的变量,当要做这样子的转换的时候,需要了解的是转换会带来信息的丢失;就好像把一个long转换为一个int,有时候会有信息的丢失。我们可以容忍这个丢失,因为从实践来看,用GUID转成int,比Random类生成随机数好随机的多。以下是如何把GUID转换为int的一个方法:

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#下其实根本不用那样子折腾

int i = Math.Abs(Guid.NewGuid().GetHashCode());

4 thoughts on “如何把GUID转换为整形INT数值”

  1. 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多个会重复,看需求了,呵呵

Leave a Reply

Your email address will not be published. Required fields are marked *