仅使用可以绑定到 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()));
我想生成一个 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()));