仅使用可以绑定到 BindableName 属性 的字符串生成 Guid,而不将其从字母数字转换为字符串,以避免重复

Generate a Guid only with strings that could bind to BindableName property without converting it to string from alphanumeric,to avoid duplicacy

我想生成一个 Guid 而不是将其从字母数字转换为 string,因为我有 1000 个 ID 绑定到它,没有重复。我想要一个可以避免重复的完美解决方案。

我认为我的方法不会创建重复但不确定:

string guid = "panelname" + GeneratingGUID.GenerateGuid().ToString("N");


                if (!GeneratingGUID.GuidHashT.Contains(guid))
                {
                    GeneratingGUID.GuidHashT.Add(guid);
                }
                else
                {
                    while (GeneratingGUID.GuidHashT.Contains(guid))
                    {
                        GeneratingGUID.GenerateGuid();
                    }
                    guid = "panelname" + GeneratingGUID.GenerateGuid().ToString("N");
                    GeneratingGUID.GuidHashT.Add(guid);
                }

提前致谢。

这将为您提供 GUID 格式的唯一字符串(您可以添加单例和线程安全)

public class UniqueIDStingOnly
{
    private static long last = 0;
    private static char[] chars = { '0', '1', '2', '3', '4', '5', '6' };
    private static char[] chars2 = { 'A', 'B', 'C', 'D', 'E', 'F' };

    public String Next()
    {
        StringBuilder sb = new StringBuilder();

        long cur = last;
        do
        {
            int mod = (int)cur % 6;
            sb.Append(chars2[mod]);
            cur /= 6;
        } while (cur > 0);

        ++last;

        while (sb.Length < 32) sb.Append("A");

        return sb.ToString();
    }
}

public class Program
{
    public static UniqueIDStingOnly uid = new UniqueIDStingOnly();

    private static void Main(string[] args)
    {
        for (int a = 0; a < 1000; a++)
        {
            string s = uid.Next();
            Guid g = new Guid(s);
            Console.WriteLine("" + a + " becomes : " + g.ToString("D"));
        }

    }
}

您可以按如下方式进行:

创建一个常规 GUID 并将“0”替换为 'g',将“1”替换为 'h' 等等。这将导致没有任何数字的 GUID,但它仍然是唯一的。

执行此操作的代码:

public static string GuidWithoutDigits()
{
    var sb = new StringBuilder(Guid.NewGuid().ToString("n"));

    for (char c = '0'; c <= '9'; ++c)
        sb.Replace(c, (char)(c - '0' + 'g'));

    return sb.ToString();
}

GUID 只是一个 16 字节的数组。您可以按照自己的方式对这些字节进行编码。例如,要创建仅包含大写字母的 32 个字符的字符串,您可以这样做:

public static string GuidCreator()
{
    var bytes = Guid.NewGuid().ToByteArray();
    var builder = new StringBuilder();
    foreach (var aByte in bytes)
    {
        var nibble1 = Convert.ToChar((aByte & 0x0F) + 65);
        var nibble2 = Convert.ToChar(((aByte & 0xF0) >> 4) + 65);
        builder.Append(nibble1);
        builder.Append(nibble2);
    }
    return builder.ToString();
}

它依次获取每个字节,将其拆分为高半字节和低半字节,并使用它们在 A - P 之间创建两个字符,然后将其构建到字符串中。

试试这个代码:它永远不会像 MDS 那样丢失唯一 ID 负载:

Guid guidValue = Guid.NewGuid();
MD5 md5 = MD5.Create();
Guid hashed = new Guid(md5.ComputeHash(guidValue.ToByteArray()));