gpt4 book ai didi

c# - 处理短链接冲突的最快 C# 实现

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:34:44 26 4
gpt4 key购买 nike

我正在为我正在构建的缩短链接的服务预生成短代码。它不是您常用的链接缩短器,所以我不能使用现成的,因为我们每秒需要处理近 1000 次缩短。

我有一项每 12 小时运行一次的服务,用于向查找表添加另外 200,000 个短链接以快速生成链接。

随着短链接表变得越来越长,服务需要的时间也越来越长,以至于我们无法满足所请求的短链接需求。

缩短链接表有 180 万行。在我们用完之前,我们还剩下 280k 个链接。现在生成 20 万个链接需要 1 个多小时。

我显然做错了什么,可能是因为我只使用了 List<string>进行比较。下面是代码块:

Stopwatch sw = Stopwatch.StartNew();
LtsDataContext ldc = new LtsDataContext();
List<string> currentCodes = ldc.ShortUrls.Select(s => s.ShortCode).ToList();
currentCodes =
currentCodes.Union(ldc.FastShortCodes.Select(s => s.ShortCode)).ToList();

int count = args.Length > 0 ? int.Parse(args[0]) : 200000;

List<string> newCodes = new List<string>(count);

for (int i = 0; i < count; i++)
{
string newCode = Guid.NewGuid().ToString("N").Substring(0, 8);
while (currentCodes.Contains(newCode) || newCodes.Contains(newCode))
newCode = Guid.NewGuid().ToString("N").Substring(0, 8);
newCodes.Add(newCode);
}

ldc.FastShortCodes.InsertAllOnSubmit(newCodes.Select(s =>
new FastShortCode() { ShortCode = s }));
ldc.SubmitChanges();
Console.Write((decimal)sw.ElapsedMilliseconds / (decimal)1000);
Console.ReadKey();

最佳答案

您的问题是,通过使用 GUID 片段,您必须针对越来越大的表检查冲突。

我假设您不想创建顺序键,因为它容易受到 URL spelunking 的攻击,但是您应该从顺序开始,然后对其进行混淆。

编辑

根据评论者的建议,我会:

1. take a sequential key
2. shift left 8
3. add a random value between 0 and 255
4. encode base-62 (0-9,A-Z,a-z)

您将不会遇到冲突,并且随机位意味着随机尝试 URL 的人每 255 次尝试只能命中一次。

关于c# - 处理短链接冲突的最快 C# 实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4379425/

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