【问题标题】:Random number six digit IDs for content in web applicationWeb 应用程序中内容的随机数六位数 ID
【发布时间】:2023-03-22 01:59:02
【问题描述】:

我正在尝试实施来自this question 的已接受答案以生成 ID 并使用 XML 文件存储我的内容和内容 ID 表。

这个想法是将每个内容项存储(序列化)为 my-content-item-slug-374871.xml,其中数字是内容项将从 IDs 表中给出的随机 ID(从那些尚未采取)。我的要求是 ID 是 100000 到 999999 之间的六位数字(显示要求),所以实际上我们只能创建 899999 个内容项,但这应该足够了。如果你想知道为什么会有这样的要求,我只能说我不想要从零开始的 ID,也不想要像 GUID 这样的 ID(我知道这会更容易创建和维护),因为 ID 将是在 MVC 路由中使用(很像 SO 的 URL)。

所以对于初学者,我决定创建一个字典,其中 key 是 ID,value 决定是否使用它(如果使用则为 true,如果可用则为 false)。然后我使用 DataContractSerializer 将此对象序列化为 XML 文件。

文件长 72MB,我认为问题开始出现了。首先,我刚尝试在 VS2010、记事本、写字板和 IE 中打开这个文件,它们都崩溃了,内存消耗猛增。但是该应用程序似乎没有问题。我仍然认为这将是巨大的内存和 CPU 消耗,性能会受到影响。

我的假设是否正确,如果正确,我还有哪些其他选择?

【问题讨论】:

  • Notepad++ 可能能够保存该文件而不会崩溃。

标签: xml serialization random xml-serialization storage


【解决方案1】:

我会建议与 Henk 相同(只需使用顺序的种子 ID),但是您可以完成您正在寻找的内容:

与其创建一个包含所有可能值的字典,一个仅包含已使用值的 GenericList 将不那么密集:

static class Static
{
    static List<int> UsedIds = new List<int>();
}

然后循环,直到找到尚未使用的一个。 (随机数可能不是最佳选择,除非您独立于时钟播种它们)。

int GetNewId()
{
    Random rand = new Random();
    while (true)
    {
        int newId = rand.Next(100000, 999999);
        if (!Static.UsedIDs.Contains(newId))
        {
            Static.UsedIDs.Add(newId);
            return newId;
        }
    }
}

这在短期应该更有效,但为了长期的性能和可扩展性,我会强烈建议使用种子身份或 GUID - 这是Base-64 编码时相当可用(类似于 YouTube URL)。

【讨论】:

  • 如果你有问题(我预测你会的)移动这一行: Random rand = new Random();在循环之外。
  • 根据 Steve Wellens 的建议更新答案。
【解决方案2】:

对于初学者,我决定创建一个字典,

您会发现 BitArray 占用的空间要少得多。

但基本问题是:为什么是“随机”?

如果您需要唯一 ID,只需使用计数器即可。从 100000 开始,每次使用时递增。

【讨论】:

    【解决方案3】:

    无需维护已使用号码的列表,只需创建新文件名并调用 File.Exists(fileName),如果不存在则不使用。

    编辑:抱歉,假设语言是 C#,但想法应该与其他语言相似。

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 2013-08-16
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      相关资源
      最近更新 更多