首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

怎样生成一个19位的唯一的id,该怎么解决

2012-05-24 
怎样生成一个19位的唯一的id数据库中已经存在有按时间生成的id,形式如yyyyhhddHHMMSS+几个随机数。注:id为1

怎样生成一个19位的唯一的id
数据库中已经存在有按时间生成的id,形式如yyyyhhddHHMMSS+几个随机数。

注:id为19为字符串。

但现在在同一个时间点(毫秒级)上,生成多个id,并插入数据库。用老方法导致生产的id重复。请问是否有什么方法可以生成一个唯一的id?

想过使用guid,但是guid生成的字符串长度太大,无法存入数据库。

[解决办法]
用Guid作为种子产生随机数。
[解决办法]

如果不存在并发的话,可以在插入前取到yyyyhhddHHMMSS,再定义一个自增整数变量。得到的id为时间后面跟上这个变量,生成多个id时,这个变量值往前加。

如果要更精细,可以把yyyyhhddHHMMSS取到毫秒。
[解决办法]
默认情况下,.net的随机数发生器会使用时间作为种子,这是导致重复的关键,因为瞬时的时间种子一样,一样的种子产生的随机数序列也一样。
[解决办法]
left(guid,x)& hhmmss
[解决办法]

探讨

默认情况下,.net的随机数发生器会使用时间作为种子,这是导致重复的关键,因为瞬时的时间种子一样,一样的种子产生的随机数序列也一样。

[解决办法]
我刚才试了下:string r = DateTime.Now.ToString("yyyyMMddHHmmssfffff");也不行,生成的都相同,期待更好的方法。
[解决办法]
这样试试,就是判断是否有重复。
C# code
        Random random = new Random(Guid.NewGuid().GetHashCode());        List<int> values = new List<int>();        for (int i = 0; i < 100; i++)        {            int value = random.Next(100000);            if (!values.Contains(value))            {                values.Add(value);                Response.Write(DateTime.Now.ToString("yyyyMMddHHmmss") + value.ToString("D5") + "<br/>");            }        }
[解决办法]
http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx
[解决办法]
private string GenerateUniqueID()
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
string str1 = DateTime.Now.ToString("yyyyMMddHHmmss");
Random d = new Random(Guid.NewGuid().GetHashCode());
string str2 = d.Next(10000, 100000).ToString();
return sb.Append(str1).Append(str2).ToString();
}
[解决办法]
还可以在每次生成一个之后,加入“Thread.Sleep(1)”,这样使用时间基本不会重复的。
[解决办法]
使用毫秒时间然后后面加上几位的随机数
[解决办法]
为什么不把字段的宽度调整一下,又不会影响历史数据
[解决办法]
yyyyhhddHHMMSS
这是14位了
+随机数3位
17位了
+自增数2位
19位了

或者像楼上几位所说的
Thread.Sleep(1);
延时1毫秒



有一次我就是调用一个自定义函数产生随机数,结果产生的随机数都一样,很纳闷。找了半天才找到原因:计算机运算速度太快了,随机数的种子一样,产生的随机数自然也是一样的。加了一个延时,就好了
[解决办法]
把guid杂凑一下,弄成19位
[解决办法]
C# code
public static string job_no(string HeadName)//编码格式        {            SqlConnection conn = new SqlConnection(connectionString);            string s = "";            // SqlCommand cmd = new SqlCommand();            // cmd.Connection = conn;            conn.Open();            SqlCommand cmd2 = new SqlCommand();            cmd2.Connection = conn;            cmd2.CommandText = "declare @s varchar(30)" +                "set @s=convert(varchar,getdate(),111)+convert(varchar,getdate(),14)" +               " set @s=replace(@s,'/','')" +               " set @s=replace(@s,':','')" +               " set @s=replace(@s,'.','')" +               " select @s";            SqlDataReader r = cmd2.ExecuteReader();            while (r.Read())            {                //s = "CL"+r[0].ToString();                s = r[0].ToString();            }            r.Close();            conn.Close();            s = HeadName + s;            return s;        }for(int i=0;i<10;i++){string _no=jobno("TE")+i;//这个 _no永远都不会重复} 


[解决办法]
你看这样写行吗?
string no;
int num;
Random rand;
while (true)
{
Thread.Sleep(10);
rand = new Random();
no = Decimal.ToUInt64(Decimal.Divide(Decimal.Subtract(DateTime.Now.Ticks, DateTime.Parse("2012-01-01 00:00:00").Ticks), 10000)).ToString();
if (19 > no.Length)
{
num = int.Parse("1".PadRight(19 - no.Length, '0'));
no += rand.Next(num, num * 10 - num);
}
}

热点排行