代码改变世界

C#根据字符串生成唯一的数字

2011-07-17 11:13  爱车龟速兔  阅读(2699)  评论(0编辑  收藏  举报

    根据字符串生成唯一的数字标识, 一般我们都会采用GUID, 根据字符串计算MD5, 计算出来的MD5码就是一个GUID.

    但是GUID太长了, 是一个128位的数字, 在存储的时候, 会很占地方, 考虑能不能生成一个短一点的数字, 比如32为的数字, 搜了搜, 有人给出了这样的方法.

    : 我们可以将一个标准的GUID 21726045-e8f7-4b09-abd8-4bcc926e9e28 转换成短的字符串 3c4ebc5f5f2c4edc

下面的方法会生成一个短的字符串,并且这个字符串是唯一的。重复1亿次都不会出现重复的,它也是依照GUID的唯一性来生成这个字符串的。

        private string GenerateStringID()
        {
            
long i = 1;
            
foreach (byte b in Guid.NewGuid().ToByteArray())
            {
                i 
*= ((int)b + 1);
            }
            
return string.Format("{0:x}", i - DateTime.Now.Ticks);
        }

 

如果想生成一个数字序列而不是字符串,你将会获得一个19位长的序列。下面的方法会把GUID转换为Int64的数字序列。

        private long GenerateIntID()
        {
            
byte[] buffer = Guid.NewGuid().ToByteArray();
            
return BitConverter.ToInt64(buffer, 0);
        }

 

看起来这个方法是可行的, 但是暂时没有找到严谨的数据论证, 可以保证多高的不冲突性能. 毕竟是做key值, 如果有一个重复, 程序就挂了.