【问题标题】:Short Id generation and maximum number of combinations短 ID 生成和最大组合数
【发布时间】:2012-06-02 12:11:03
【问题描述】:

好吧,这可能更像是一个数学问题,但由于它与编程和我的网络应用程序有关,我会先在这里问:

我正在尝试创建 8 个字符长的短 ID。从中提取 id 的“池”是数字、大小写字母的组合。

string charPool = "ABCDEFGOPQRSTUVWXY1234567890ZabcdefghijklmHIJKLMNnopqrstuvwxyz"

如果你有兴趣,方法如下:

private string GenerateRandomCode(int length)
{
    string charPool = "ABCDEFGOPQRSTUVWXY1234567890ZabcdefghijklmHIJKLMNnopqrstuvwxyz";
    StringBuilder rs = new StringBuilder();

    for (int i = 0; i < length; i++)
    {
        rs.Append(charPool[(int)(_random.NextDouble() * charPool.Length)]);
    }

    return rs.ToString();
}

8 个字符 id 有多少种可能的组合?如果您也可以发布方程式,将不胜感激:)

谢谢

【问题讨论】:

  • 每个插槽的选项 ^ 插槽数 = 组合数。 a-z 是 26,乘以 2(也适用于上限)是 52,加上 10 (0-9) 是 62。每个 ID 有 8 个字符长,所以结果是 62^8,这是相当大的:218,340,105,584,896 个可能的唯一 ID。我建议在没有任何随机机制的情况下生成它们。
  • 不,它是我正在开发的实际 MVC Web 应用程序 - 为什么重要?
  • Random.Next() msdn.microsoft.com/en-us/library/zd1bc8e5.aspx 的整数重载会更干净。
  • 我明白你的意思 - int.maxValue 应该涵盖大多数用例。猜猜这是可扩展性的问题,尽管 int.maxvalue 应该返回合理数量的可能值。

标签: c# combinations


【解决方案1】:

options per slot ^ number of slots = number of combinations

a-z 是 26,乘以 2(对于上限也是如此)是 52,加上 10 (0-9) 是 62。每个 ID 是 8 个字符长,所以结果是 62^8,这是相当大的:

218,340,105,584,896 possible unique ID's

我建议这样做:

_random.Next(charPool.Length - 1)

(并将charPool.Length - 1 保存在循环外的变量中),而不是:

_random.NextDouble() * charPool.Length

因为您可能会得到一个精确的 1.0.nextDouble(),这意味着您将在等于长度的索引处访问数组,并且您将得到 IndexOutOfRangeException。

【讨论】:

  • 为什么不使用随机?在网络应用中,我们将检查碰撞,这还不够吗?
  • 检查碰撞并在碰撞时重新生成?我想...但是如果您不介意按逻辑顺序生成 ID,我建议您使用其他算法。我正在努力,很快就会发布我的建议。
  • 非常感谢 - 解决问题的部分方法是避免人们“猜测”下一个 id
  • 你想让一个字符出现多次吗?示例:“ab88a2ab” - 这是有效的吗?我想你会这样做,在这种情况下,事实证明,这确实是随机数的好方法。但是,如果您想以合乎逻辑的方式浏览所有可能的选项,那将是另一种情况。无论如何,请参阅我的编辑以获取代码中的重要修复。
  • 当然,“ab88a2ab”是有效的
猜你喜欢
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-29
相关资源
最近更新 更多