本帖最后由 SCAUSCNU 于 2011-03-03 23:50:20 编辑

解决方案 »

  1.   

    1.全部生成完了,再判断吧,有重复的就移除或者重新生成一个
    list.RemoveAll(l=>l.val > 0)
    .Net3.5+ 可以利用HashSet<T> 类HashSet<T> 类提供高性能的集运算。 集合是一组不重复出现且无特定顺序的元素。 
    HashSet<T> 对象的容量是该对象可以容纳的元素个数。 HashSet<T> 对象的容量将随该对象中元素的添加而自动增大。 
    从 .NET Framework 4 版开始,HashSet<T> 类实现了 ISet<T> 接口。 
    但它不能通过索引访问,其Contains()方法的时间复杂度是List<T>的1/n,直接将List<T>拷至HashSet<T>中即消除了所有重复项。
    HashSet<T> hs = new HashSet<T>(list); 
    list.Clear();
    list.AddRange(hs);2.应该说使用GUID重复的机率是很小很小的,至少一个项目里几乎是不会重复的
    如果还不放心,可以在前面加上当前的时间戳+GUID,不过这样貌似会显得很长
      

  2.   

    guid我加了哈希代码 Guid.NewGuid().GetHashCode()
      

  3.   

    对于一个限定用.net 2.0,c#3.0来说,linq根本不能用,不然就方便多了
      

  4.   

    没有哪个随机数生成器是以重复率低为设计目标的。虽然所有的随机数生成器产生的随机序列严格地说都是伪随机序列。好的随机数生成器,或者说随机数生成器的设计目标是生成的随机数更符合随机性,更贴近真实世界的随机数。它应该通过尽量多的随机性试验,具有很好的分布特性。所以随机数重复概率应该是p = 生成的随机数/随机组合总数(假设随机数生成器足够好)。之所以GUID不容易重复就是因为它的随机组合总数比较大。
      

  5.   

    虽然guid好,但是生成大量的数据,最后总要再加个判断里面有没有重复数据吧?然后问题就来了?如果我先生成全部数据再判断,我就不会了
      

  6.   

    如果说重复的概率足够低,低到什么程度呢?比你的程序出错概率低(比如你的程序可以无错工作100年,这个程序已经很了不起了),比人类的寿命长,……那么就可以认为概率为0。这样的重复足够可以忽略不计。GUID就是这样一种东西,虽然存在理论上重复的可能。但是没有任何一个人能活着看到这种情况发生。
      

  7.   

    严格地说,没有没有BUG的程序,没有可靠性=1的程序。自然界也没有绝对不会发生的事情。所以不要被理论上存在一个极小概率的事情迷惑。
      

  8.   

    你的意思是不用判断了??我们老师提示的是RNGCryptoServiceProvider,但是他里面还有写到,如果出现重复该怎么处理??好烦啊
    明天问一下同学,先谢谢楼上各位啦,我睡觉啦
      

  9.   

    如果用GUID,不用测试!如果老师问你,你这么说,GUID的重复概率甚至小于内存读取出错的概率。(比如你读取内存里面一个二进制1,有一个极小概率你得到的是0)。因此这种“检测”毫无意义。如同你不用考虑使用天平秤以前度量砝码上是否有灰尘。
      

  10.   

    再打一个比喻,在目前的硬件上检测GUID的重复,如同用厘米尺去测量一微米的长度一样。测量工具本身的精度比被测物体差。就算用一台最新的电脑不断生成GUID,你们老师直到去世也等不来重复发生。
      

  11.   

    不知道你怎么比较,和性能要求到多少,没生成一个用list.Contains判断一下应该不会很久吧。
    如果你想绝对不重复是一定要比较的。
      

  12.   

    用GUID就OK了。不会重复!
    如果不用,可以考虑Dictionary,键存储字符串而值给个NULL就行
    用方法ContainsKey判断速度很快!
      

  13.   

    guid的所谓重复概率是理论上的,比你买彩票每天都中一千万概率都要小很多...你担心个什么?
      

  14.   

    反正我目前的项目中单独使用GUID做主键,唯一性有数据库约束着,假如插入失败,提示下用户系统错误,重新提交一下就好(其实这种假如根本不可能发生)
    如果是2.0,那也只好自己写个方法,遍历去判断了,不过使用GUID的话,我是觉得没有这个必要了,区区100000而已,别人上千万的都没有重复的
      

  15.   

    sb.Append(a[new Random(Guid.NewGuid().GetHashCode()).Next(0, a.Length -1)]); 
      

  16.   

    http://topic.csdn.net/u/20110304/00/5b2b41a9-e90f-4ca8-af32-126da0441df2.html?56864
      

  17.   

    没看出来你用guid的目的,直接用字符串存储对比就可以了。因为
    string[] a;
    Array.Contains(a,"字符串")
    这样不慢的。
      

  18.   

    产生不重复的随机数,如23楼所示,我使用stringbuffer
      

  19.   

    contains里面虽说只有一条语句,但实际是很复杂的算法实现?
    http://blog.csdn.net/zhoufoxcn/archive/2010/08/19/5825093.aspx
      

  20.   

    把照片贴上来"
    http://topic.csdn.net/u/20110304/00/5b2b41a9-e90f-4ca8-af32-126da0441df2.html?56864http://
      

  21.   

    http://topic.csdn.net/u/20110304/00/5b2b41a9-e90f-4ca8-af32-126da0441df2.html?56864
      

  22.   

    你为啥要生成这么多,10W个还要去判断,这样给程序增加负担,不妨考虑用时间戳,不会重复的,不用去判断,
    ps:你给他留言了吗?我没看到啊
      

  23.   

    其实我真的是 慕名来围观的------------------------------------直接guid就可以了, 就如P哥说的 你 "哈希"个什么???guid 生成后你无须去判断 是否重复。如果你真的害怕,你可以在 字符串的前 拼接个 时间日期比如: “20110304”+guid
      

  24.   

    想要真正的高效还是要想办法除去 判断重复 这一步...
    因为你是要16位的,所以要自己写一个生成随机字符串的方法...
    当然可以利用 Guid ...
      

  25.   

    本来有可能“BA”,到排序的时候变成了"AB",这样不是被误判断了,多生成了一次吗?
    况且,你添加的数字和随机生成的数字不会重复混淆吗?
    所有我的这种方法不太可行?如果不判断是否包含AB字符串,我的方法应该是可以的
      

  26.   

    楼主,如果你不是在开发核武器,GUID绝对足够满足你的需求。我很奇怪你为什么不相信官方的framework中现成的东西,非要自己从头做起;或者至少你把GUID研究透彻之后,再下结论也不迟。
      

  27.   

    我常用的方法是用Dictionary<string, string>, 键值都是生成的那个字符串。Java里我就用Hashtable。
    生成后用内建的containskey函数判断下就可以了。
    用这还挺顺手。
    拙见,见笑了。
      

  28.   

    为什么不看看这个帖子,早有前人讨论过这个问题了
    http://topic.csdn.net/t/20061024/14/5105293.html
      

  29.   

      IEnumerable<string> inters = List1.Intersect(List2);
    交集
      

  30.   

    根据http://topic.csdn.net/t/20061024/14/5105293.html里面的,大家说说,如果:把生成的指定防伪码至少10万以上(因为一开始就是用list.contains判断了,生成的所以不重复)存入专门放置防伪码的数据库表里,规定放进去的防伪码不与表中已有的重复,想想:若是设置了防伪码为主键就无需判断啦,若出现重复虽插入失败,但是可是继续生成重新插入,这样比关于重复问题的比较效率应该快些吧,再说,通常插进去极少机会会遇到主键重复的,是批量插指定数量数据的,一定要达到自己设定的防伪码个数。大家觉得怎样呢?