none
怎样生成一个19位的唯一的id RRS feed

  • 问题

  • 数据库中已经存在有按时间生成的id,形式如yyyyhhddHHMMSS+几个随机数。

    注:id为19为字符串。

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

    想过使用guid,但是guid生成的字符串长度太大,无法存入数据库。
    2012年5月22日 5:52

答案

  • 一定要一毫秒产生984个数据?建议暂缓,比如使用Thread.Sleep(10)类似的延时:

    string s = DateTime.Now.ToString("yyyyhhddHHMMss");
                for (int i = 1; i < 11; i++)
                {
                    s += Guid.NewGuid().ToString().Substring(0, 5);
                    Console.WriteLine(s);                
    Thread.Sleep(10); s = DateTime.Now.ToString("yyyyhhddHHMMss"); }


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月22日 6:16
    版主
  •         private void button1_Click(object sender, EventArgs e)
            {
                int sss = int.Parse(Math.Abs(GetRandomSeed()).ToString().Substring(0, 5));
            }
            static int GetRandomSeed()
            {
                byte[] bytes = new byte[4];
                System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
                rng.GetBytes(bytes);
                return BitConverter.ToInt32(bytes, 0);
            }

    兄弟 如果你不放心 可以采用我下面说的方法..我试过了 还不错

    2012年5月22日 6:28
    版主

全部回复

  • 使用C#技术截取Guid的字符串若干位,拼接到yyyyhhddHHMMSS,例如:

    【模拟生成10次的Guid,19位】

     string s = DateTime.Now.ToString("yyyyhhddHHMMss");
                for (int i = 1; i < 11; i++)
                {
                    s += Guid.NewGuid().ToString().Substring(0, 5);
    Thread.Sleep(1); //可以加,随机性更大…… Console.WriteLine(s); s = DateTime.Now.ToString("yyyyhhddHHMMss"); }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月22日 5:58
    版主
  • 使用C#技术截取Guid的字符串若干位,拼接到yyyyhhddHHMMSS,例如:

    【模拟生成10次的Guid,19位】

     string s = DateTime.Now.ToString("yyyyhhddHHMMss");
                for (int i = 1; i < 11; i++)
                {
                    s += Guid.NewGuid().ToString().Substring(0, 5);
                    Console.WriteLine(s);
                    s = DateTime.Now.ToString("yyyyhhddHHMMss");
                }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    我曾经查过数据库,在一个同一个时间上,同一个毫秒上,最多有984条数据。

    这样的话,感觉这个方法应该不行吧?

    2012年5月22日 6:11
  • 一定要一毫秒产生984个数据?建议暂缓,比如使用Thread.Sleep(10)类似的延时:

    string s = DateTime.Now.ToString("yyyyhhddHHMMss");
                for (int i = 1; i < 11; i++)
                {
                    s += Guid.NewGuid().ToString().Substring(0, 5);
                    Console.WriteLine(s);                
    Thread.Sleep(10); s = DateTime.Now.ToString("yyyyhhddHHMMss"); }


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月22日 6:16
    版主
  • 使用C#技术截取Guid的字符串若干位,拼接到yyyyhhddHHMMSS,例如:

    【模拟生成10次的Guid,19位】

     string s = DateTime.Now.ToString("yyyyhhddHHMMss");
                for (int i = 1; i < 11; i++)
                {
                    s += Guid.NewGuid().ToString().Substring(0, 5);
    Thread.Sleep(1); //可以加,随机性更大…… Console.WriteLine(s); s = DateTime.Now.ToString("yyyyhhddHHMMss"); }

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    谢谢。加入等待应该是可以了。
    2012年5月22日 6:18
  •         private void button1_Click(object sender, EventArgs e)
            {
                int sss = int.Parse(Math.Abs(GetRandomSeed()).ToString().Substring(0, 5));
            }
            static int GetRandomSeed()
            {
                byte[] bytes = new byte[4];
                System.Security.Cryptography.RNGCryptoServiceProvider rng = new System.Security.Cryptography.RNGCryptoServiceProvider();
                rng.GetBytes(bytes);
                return BitConverter.ToInt32(bytes, 0);
            }

    兄弟 如果你不放心 可以采用我下面说的方法..我试过了 还不错

    2012年5月22日 6:28
    版主
  • 谢谢。加入等待应该是可以了。

    不用谢!请把你认为凡是对的答案标记(注意,可能是多个答案!)

    另外,多来MSDN做客提问,交流技术,帮助别人!


       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月22日 7:37
    版主
  • 我也新手,如果我没记错,数据库好像有个类型是

    sqluniqueidentifier类型,网上搜索一下就知道用法了,自动生成的ID是绝对唯一的,国内两大ERP软件的表也是用这种生成方式

    2012年5月22日 22:38
  • 我也新手,如果我没记错,数据库好像有个类型是

    sqluniqueidentifier类型,网上搜索一下就知道用法了,自动生成的ID是绝对唯一的,国内两大ERP软件的表也是用这种生成方式


    兄弟这是guid 不是19位的 呵呵
    2012年5月24日 1:44
    版主
  • 呵呵,不好意思,如果限制在19位的话,注:id为19为字符串的话,我还有一个方法

    是就把这些数据的最后几位生成的随机数转换成16进制在存到数据库不就又能省下一些位数了吗?

    2012年5月24日 4:29
  • 呵呵,不好意思,如果限制在19位的话,注:id为19为字符串的话,我还有一个方法

    是就把这些数据的最后几位生成的随机数转换成16进制在存到数据库不就又能省下一些位数了吗?

    欢迎交流!不妨列出代码来吧……:-)

       QQ我:讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处

    2012年5月24日 4:36
    版主