2014-05-23 46 views
0

我有一个客户端,它需要我生成完全独特的ID,永远不会重复。 他不会接受这样一个事实,即Guid.NewGuid()在统计上不会重复,直到天数https://stackoverflow.com/a/1705027/937131结束。总是唯一的Guid不够独特

所以我把这作为一个挑战,并试图做出一个方法,产生一个身份证,将永远不会重复a.k.a. a NONCE

我的一般想法是,如果我可以在每个Guid的末尾添加时间部分,这应该起作用。

有关如何改善这一点的任何想法?

namespace JensB.Tools 
{ 
    public class RandomGenerator 
    { 
     public string GetNOnce() 
     { 
      string unique = Guid.NewGuid().ToString(); 
      unique = unique.Replace("-", ""); 

      long unixTimestamp = (long)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; 
      string timeString = ToBase62(unixTimestamp); 

      unique = unique + timeString; 

      return unique; 
     } 

     private string ToBase62(long input) 
     { 
      string baseChars = ALPHANUMERIC_ALT; 
      string r = string.Empty; 
      int targetBase = baseChars.Length; 
      do 
      { 
       r = string.Format("{0}{1}", 
        baseChars[(int)(input % targetBase)], 
        r); 
       input /= targetBase; 
      } while (input > 0); 

      return r; 
     } 

     private static string ALPHANUMERIC_ALT = 
      "23456789" + 
      "abcdefghjkmnpqrstuvwxyz"; 
    } 
} 
+4

告诉你的客户他是一个偏执狂和一个完整的门外汉。创建一个包装器,它会直接返回'Guid.NewGuid()',并为客户的工作计费。 – Tarec

+2

@Tarec:虽然我们中的很多人在做白日梦的时候肯定会这样做,“商业上的考虑妨碍我采取这一建议”。 – Jon

+0

@Tarec他不会就此事做出让步,所以我只是想看看是否有人对任何真正独特的发电机有任何想法:) – JensB

回答

1

我有一个客户端,它需要我生成完全独特的ID,永远不会重复。

这当然是不可能的。请参阅Pigeonhole principle

UUID是一个128位整数,因此可以有2^128个唯一ID。所以如果你生成2^128 + 1的ID,你至少有一个重复。


对于真实世界的场景,Guid.NewGuid()已经足够好了。

1

您可以维护所有先前生成的GUID的列表,例如在数据库中,然后拒绝任何发生冲突的列表。

这样你可以保证你生成的所有GUID都是唯一的。

1

生成两个GUIDS并将它们添加在一起....这将真的永远不会重复!

创建guid的原始方式之一涉及机器的MAC地址和时间。 这被发现并不像人们可能猜到的那么可靠。