gpt4 book ai didi

c# - 生成基础64 ID

转载 作者:行者123 更新时间:2023-12-03 05:31:50 24 4
gpt4 key购买 nike

我认为这个问题主要是基于意见的,但是,出于安全原因,我为数据库表的可见ID列创建了自己的Base64 ID生成器((我看到了video关于YouTube这么做的原因,尽管我请参阅其他可能没有问题的安全性方法)。它处理高度不太可能发生重复的事件,但是,我很想知道是否将其用作YouTube视频ID的标准。

Program.cs

class Program
{
static void Main(string[] args)
{
var ids = new HashSet<string>();
var count = 0; // for testing only
while (count < 8)
{
ids.Add(Base64Id.GenerateId(ids));
Console.ReadLine();
count++; // for testing only
}
}
}

Base64Id.cs
public static class Base64Id
{
private static int IdSize = 1; // Should be 11
private static readonly string[] AllowedChars = {
"0", "1", "2", "3", "4", "5", "6", "7"//,
//"8", "9", "a", "b", "c", "d", "e", "f",
//"g", "h", "i", "j", "k", "l", "m", "n",
//"o", "p", "q", "r", "s", "t", "u", "v",
//"w", "x", "y", "z", "A", "B", "C", "D",
//"E", "F", "G", "H", "I", "J", "K", "L",
//"M", "N", "O", "P", "Q", "R", "S", "T",
//"U", "V", "W", "X", "Y", "Z", "-", "_"
};

private static Random _random = new Random();

/// <summary>
/// To generate a Base64 ID and check to make sure the ID is not already in use.
/// </summary>
/// <param name="usedIds">List of IDs already in use from the Database or other source.</param>
/// <returns>New Base64 ID</returns>
public static string GenerateId(HashSet<string> usedIds)
{
var autoGenId = "";

do
{
autoGenId = "";
for (var i = 0; i < IdSize; i++)
autoGenId += GetRandomChar();
#if DEBUG
_DEBUG_(usedIds.Count() + 1, autoGenId);
#endif
}
while (IsTaken(autoGenId, usedIds));

return autoGenId;
}

private static string GetRandomChar()
{
var i = _random.Next(0, AllowedChars.Length);
return AllowedChars[i];
}

private static bool IsTaken(string id, HashSet<string> usedIds)
{
var check = usedIds.Any(i => id.Contains(i));
if (check)
return true;


return false;
}

private static void _DEBUG_(int count, string id)
{
Console.WriteLine(String.Format("{0}:\t{1}", count, id));
}
}

我相信这对我而言将是一种魅力,就像在测试期间一样,没有任何问题。 但是,一旦我将其缩小到8个字符,并且ID的长度为1,它就会在8个预期输出中只有6个发生之后由于不断循环而引发严重错误。

我知道这是因为每次都击中一个随机数,选择的次数越少,循环就越有可能发生。

我知道可以解决此问题的方法,但是,按我计划的规模,想到它是很疯狂的,例如拥有每种可能性的阵列/列表并删除选定的ID。

这是我的问题;

  1. Do the likes of Youtube know of this problem, and just don't care due to the size of possible IDs.
  2. They just have much greater thought put into the class.
  3. They do not care about the processing cost for such high numbers and handle every small detail.
  4. Or do they use Base64Encode in there code instead of auto-generating it.


我想知道您对如何改进代码的意见和建议,甚至对如此庞大的数字是否重要也很重要。我已经回答了我认为可以改善它的方法。

更新

我在周末留下了两个控制台,一个使用 List,另一个使用 HashSet,并且处理后的记录之间的差异在另一个层次上。因此,我将上面的代码更改为 HashSet而不是 List,并将代码设置为自动运行。

最佳答案

我认为,对于可能的ID数量而言,要确保ID越是唯一就越不值得花大量精力进行处理,因为存在 73,786,976,294,838,206,464 可能性。

假设有10个可能的ID 1-> 10,如果已经选择了2个,则下次有20%的机会被复制,如果选择8个,则有80%的机会被复制(每次,)。使用概率,这将堆叠并降低您获得唯一ID出现的机会。

一旦数量少,这是很糟糕的,第一次花了14539279次迭代,第二次花了662984次迭代才能出现所有8个唯一ID。我知道,有了更大的数字,到达这个突破点将需要更长的时间,但情况会更糟。

我认为,一旦数字变大以充分利用它,就可以将其分解为二叉树,一旦每个说几对的100k或100万块达到50%或60%的使用率,就把其余的忘掉并转移到下一个范围。

我认为这可能是尝试加快将唯一ID处理到可能列表的后续阶段的好方法。

关于c# - 生成基础64 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36941309/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com