gpt4 book ai didi

c# - 创建你自己的 Tinyurl 风格的 uid

转载 作者:IT王子 更新时间:2023-10-29 04:52:28 28 4
gpt4 key购买 nike

我正在写一篇关于 Guid/UID 的人类可读替代品的小文章,例如 TinyURL 上用于 url 哈希的那些(通常印在杂志上,因此需要简短)。

我生成的简单 uid 是 - 6 个字符:小写字母 (a-z) 或 0-9。

“根据我的计算船长”,这是 6 个相互排斥的事件,尽管计算冲突的概率比 P(A 或 B) = P(A) + P(B) 更难一些,因为显然它包括数字和下面的代码,您可以看到它是使用数字还是使用 50/50 的字母。

我对冲突率很感兴趣,如果下面的代码是您从生成哈希中获得的预期冲突率的真实模拟。平均而言,我每百万次发生 40-50 次冲突,但请记住,uid 不会一次生成一百万次,但可能每分钟只会生成大约 10-1000 次。

每次发生冲突的概率是多少,谁能提出更好的方法?

static Random _random = new Random();

public static void main()
{
// Size of the key, 6
HashSet<string> set = new HashSet<string>();
int clashes = 0;
for (int n=0;n < 1000000;n++)
{
StringBuilder builder = new StringBuilder();

for (int i =0;i < 7;i++)
{
if (_random.NextDouble() > 0.5)
{
builder.Append((char)_random.Next(97,123));
}
else
{
builder.Append(_random.Next(0,9).ToString());
}
}

if (set.Contains(builder.ToString()))
{
clashes++;
Console.WriteLine("clash: (" +n+ ")" +builder.ToString());
}

set.Add(builder.ToString());
_random.Next();
//Console.Write(builder.ToString());
}

Console.WriteLine("Clashes: " +clashes);
Console.ReadLine();
}

更新: Here's the resulting article来自这个问题

我真的在这里问了两个问题所以我在作弊。我想要的答案是 rcar,但是 Sklivvz 也是第二部分的答案(备选)。是否可以在数据库中制作自定义唯一 ID 生成器,或者它是客户端(首先可能读取 2 次)?

我的总体想法是在数据库或其他可以通过电话或打印 Material 使用的商店中使用 ID,而不是一个巨大的 16 字节 guid。

更新 2: 我将两个相互排斥事件的公式放在上面,而不是 2 个独立事件(因为第一次得到“a”并不意味着你不能得到“a” '第二次)。应该是 P(A and B) = P(A) x P(B)

最佳答案

为什么要使用随机函数?我一直假设 tinyurl 使用 base 62 (0-9A-Za-z) 表示顺序 Id。没有冲突,网址总是尽可能短。

你会有一个像这样的数据库表

Id  URL
1 http://google.com
2 ...
... ...
156 ...
... ...

相应的 URL 为:

http://example.com/1
http://example.com/2
...
http://example.com/2W
...

关于c# - 创建你自己的 Tinyurl 风格的 uid,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/190701/

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