【发布时间】:2016-04-29 14:45:13
【问题描述】:
我认为这个问题主要是基于意见的,但是,出于安全原因,我已经为我的数据库表的可见 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。
这是我的问题;
- Youtube 之类的人是否知道这个问题,并且由于可能的 ID 的大小而不在意。
- 他们只是在课堂上投入了更多的思想。
- 他们不关心如此大数量的处理成本,并处理每一个小细节。
- 或者他们是否在代码中使用 Base64Encode 而不是自动生成它。
我想知道您对如何改进代码的意见和建议,或者是否对如此庞大的数字很重要。我已经回答了我认为可能的改进方法。
更新
我让两个控制台在周末运行,一个使用List,另一个使用HashSet,处理的记录之间的差异在另一个层面上。所以我把上面的代码改成了HashSet而不是List,并将代码设置为自动运行。
【问题讨论】:
标签: c# database-design youtube base64