永远独特的Guid不够独特

时间:2014-05-23 09:30:26

标签: c# .net-4.5

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

所以我把这作为一个挑战,并尝试制作一个方法,生成一个永远不会重复a.k.a. NONCE的ID。

我的一般想法是,如果我可以在每个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";
    }
}

3 个答案:

答案 0 :(得分:1)

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

通过这种方式,您可以保证您生成的所有GUID都是唯一的。

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

  

我有一个客户,要求我生成完全独特的ID,永远不会复制。

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

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


对于真实场景,Guid.NewGuid()足够好了。