Guid.NewGuid() VS Random.Next() 的随机字符串生成器

2023-12-29

我和我的同事正在讨论使用哪种方法来自动生成用户 ID 和帖子 ID 以在数据库中进行识别:

一个选项使用 Random 的单个实例,并采用一些有用的参数,以便它可以重用于各种字符串生成情况(即从 4 位数字 pin 到 20 位字母数字 id)。这是代码:

// This is created once for the lifetime of the server instance
class RandomStringGenerator
{
    public const string ALPHANUMERIC_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
    public const string ALPHA_CAPS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    public const string NUMERIC = "1234567890";

    Random rand = new Random();
    public string GetRandomString(int length, params char[] chars)
    {
        string s = "";
        for (int i = 0; i < length; i++)
            s += chars[rand.Next() % chars.Length];

        return s;
    }
}

另一个选项就是使用:

Guid.NewGuid();

see MSDN 上的 Guid.NewGuid http://msdn.microsoft.com/en-us/library/system.guid.newguid.aspx

我们都知道Guid.NewGuid()可以满足我们的需求,但我宁愿使用自定义方法。它做同样的事情,但有更多的控制。

我的同事认为,由于自定义方法是我们自己编写的,因此更容易产生冲突。我承认我并不完全了解 Random 的实现,但我认为它与 Guid.NewGuid() 一样随机。自定义方法的典型用法可能是:

RandomStringGenerator stringGen = new RandomStringGenerator();
string id = stringGen.GetRandomString(20, RandomStringGenerator.ALPHANUMERIC_CAPS.ToCharArray());

Edit 1:

  • 我们使用的 Azure 表不具有用于生成密钥的自动增量(或类似)功能。
  • 这里的一些答案只是告诉我使用 NewGuid() “因为这就是它的用途”。我正在寻找更深入的原因,以解释为什么在与 Guid 具有相同自由度的情况下,熟化方法可能更有可能产生碰撞。

Edit 2:

我们还使用了 Cooked up 方法来生成帖子 ID,与会话令牌不同,它需要看起来漂亮才能在我们网站的 URL 中显示(例如http://mywebsite.com/14983336 http://mywebsite.com/14983336),所以这里不可以选择引导,但是仍然要避免冲突。


我正在寻找更深入的原因,以解释为什么在与 Guid 具有相同自由度的情况下,熟化方法可能更有可能产生碰撞。

首先,正如其他人指出的那样,Random不是线程安全的;从多个线程使用它可能会导致它损坏其内部数据结构,以便它始终生成相同的序列。

Second, Random根据当前时间播种。两个实例Random在同一毫秒内创建(回想一下,一毫秒是几个million现代硬件上的处理器周期)将具有相同的种子,因此将产生相同的序列。

第三,我撒谎了。Random不是根据当前时间播种;它的种子基于机器处于活动状态的时间。种子是一个 32 位数字,由于粒度以毫秒为单位,因此只需几周时间即可完成。但这不是问题所在;问题是:您创建该实例的时间段Random很可能是在机器启动后的几分钟内。每次您重新启动机器或在集群中使新机器联机时,都会有一个小窗口,其中会创建 Random 实例,发生的情况越多,您获得种子的可能性就越大你以前有过。

(更新:.NET 框架的新版本已经缓解了其中一些问题;在这些版本中,您不再需要Random在同一毫秒内创建的种子具有相同的种子。但仍然存在很多问题Random;永远记住,它只是伪随机,而不是加密强度随机。Random实际上是非常可预测的,所以如果你依赖于不可预测性,那么它是不适合的。)

正如其他人所说:如果您想要数据库的主键,那么让数据库为您生成主键;让数据库完成它的工作。如果你想要一个全局唯一标识符那么使用指南;这就是他们的目的。

最后,如果您有兴趣了解有关 guid 的使用和滥用的更多信息,那么您可能需要阅读我的“guid 指南”系列;第一部分在这里:

https://ericlippert.com/2012/04/24/guid-guide-part-one/ https://ericlippert.com/2012/04/24/guid-guide-part-one/

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Guid.NewGuid() VS Random.Next() 的随机字符串生成器 的相关文章

  • boost::multi_index_container 复合键中的 equal_range 与比较运算符

    我正在尝试从多索引容器查询结果 其中值类型是三个元素的结构 第一个值已给出 但第二个和第三个值必须大于或小于查询参数 经过搜索后 我发现必须实现自定义密钥提取器 并且这里的一些链接建议相同 但我无法实现它 boost multi index
  • 创建 DirectoryEntry 实例以供测试使用

    我正在尝试创建 DirectoryEntry 的实例 以便可以使用它来测试将传递 DirectoryEntry 的一些代码 然而 尽管进行了很多尝试 我还是找不到实例化 DE 并初始化它的 PropertyCollection 的方法 我有
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 如何在 Unity 中从 RenderTexture 访问原始数据

    问题的简短版本 我正在尝试访问 Unity 中 RenderTexture 的内容 我一直在使用 Graphics Blit 使用自己的材质进行绘制 Graphics Blit null renderTexture material 我的材
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • C++ 求二维数组每一行的最大值

    我已经设法用这个找到我的二维数组的每一行的最小值 void findLowest int A Cm int n int m int min A 0 0 for int i 0 i lt n i for int j 0 j lt m j if
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 如何在没有 Control.Invoke() 的情况下从后台线程修改控件属性

    最近 我们遇到了一些旧版 WinForms 应用程序 我们需要更新一些新功能 在专家测试该应用程序时 发现一些旧功能被破坏 无效的跨线程操作 现在 在您认为我是新手之前 我确实有一些 Windows 窗体应用程序的经验 我不是专家 但我认为
  • 使用 Microsoft Graph API 订阅 Outlook 推送通知时出现 400 错误请求错误

    我正在尝试使用 Microsoft Graph API 创建订阅以通过推送通知获取 Outlook 电子邮件 mentions 我在用本文档 https learn microsoft com en us graph api subscri
  • C# 中可空类型是什么?

    当我们必须使用nullable输入 C net 任何人都可以举例说明 可空类型 何时使用可空类型 https web archive org web http broadcast oreilly com 2010 11 understand
  • 将字符串从非托管代码传递到托管

    我在将字符串从非托管代码传递到托管代码时遇到问题 在我的非托管类中 非托管类 cpp 我有一个来自托管代码的函数指针 TESTCALLBACK FUNCTION testCbFunc TESTCALLBACK FUNCTION 接受一个字符
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • c# Asp.NET MVC 使用FileStreamResult下载excel文件

    我需要构建一个方法 它将接收模型 从中构建excel 构建和接收部分完成没有问题 然后使用内存流导出 让用户下载它 不将其保存在服务器上 我是 ASP NET 和 MVC 的新手 所以我找到了指南并将其构建为教程项目 public File
  • 基于范围的 for 循环中的未命名循环变量?

    有没有什么方法可以不在基于范围的 for 循环中 使用 循环变量 同时也避免编译器发出有关未使用它的警告 对于上下文 我正在尝试执行以下操作 我启用了 将警告视为错误 并且我不想进行像通过在某处毫无意义地提及变量来强制 使用 变量这样的黑客
  • 为什么模板不能位于外部“C”块内?

    这是一个后续问题一个答案 https stackoverflow com questions 4866433 is it possible to typedef a pointer to extern c function type wit
  • 更改窗口的内容 (WPF)

    我创建了一个简单的 WPF 应用程序 它有两个 Windows 用户在第一个窗口中填写一些信息 然后单击 确定 这会将他们带到第二个窗口 这工作正常 但我试图将两个窗口合并到一个窗口中 这样只是内容发生了变化 我设法找到了这个更改窗口内容时
  • AccessViolationException 未处理

    我正在尝试使用史蒂夫 桑德森的博客文章 http blog stevensanderson com 2010 01 28 editing a variable length list aspnet mvc 2 style 为了在我的 ASP
  • 检查 url 是否指向文件或页面

    我们需要以下内容 如果文件确实是文件 则从 URL 下载该文件 否则 如果它是一个页面 则什么也不做 举个简单的例子 我有以下命令来下载文件 My Computer Network DownloadFile http www wired c
  • 如何使用 ReactiveList 以便在添加新项目时更新 UI

    我正在创建一个带有列表的 Xamarin Forms 应用程序 itemSource 是一个reactiveList 但是 向列表添加新项目不会更新 UI 这样做的正确方法是什么 列表定义 listView new ListView var
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud

随机推荐

  • Javascript 预加载图像以更改 css 背景图像

    我正在开发一个网站 需要在链接悬停时更改 div 的背景图像 它的工作方式是 a href index php title Home li Home br span class nav desc Text text span li a a
  • 如何增加YARN中nodemanager中的容器数量

    我的 YARN 集群中的一个节点有 64GB 内存和 24 个核心 我在yarn site xml中设置了以下属性
  • Zend Framework 中的 GreaterOrEqual 验证器

    几分钟前意识到没有GreaterOrEqualThan验证器 或参数GreaterThan验证器改变其行为 gt to gt 为什么 是否可以作曲 gt 使用基本 zend 框架验证器集的验证器 是的 伙计们 我知道我可以编写自己的验证器
  • 角度单元测试选择 onChange 监视空值

    我想测试一个 select onChange 事件 使用间谍但我收到错误 Expected spy onSelect to have been called with en but actual calls were 成分 Componen
  • 将一个 SwiftUI 视图从另一个视图下方滑出

    我正在尝试使用 SwiftUI 构建动画 Start A B D End A B C D 动画的关键要素是 C 应该看起来从 B 下面滑出 不是从零宽度展开 所有视图的宽度都是由子视图定义的 并且是未知的 所有子视图的宽度在动画期间或之后不
  • OSError: [Errno 8] Exec 格式错误: 在 AWS EC2 ARM 风味机中使用 Chromedriver 时出现“/home/ec2-user/Desktop/chromedriver”错误

    我有一台来自 AWS 的带有 ARM 风格的 EC2 机器 我安装了Python 3 然后使用pip3安装硒 然后我从以下位置下载了 Linux 版本的 chrome 驱动程序here https chromedriver storage
  • jQuery .load() 不适用于我的图像

    我有一些代码试图在图像加载完成后运行 我使用以下 jQuery 代码 myimageid load function alert Image Loaded 但是弹出窗口永远不会出现 我无法让 load 函数工作 有人遇到过这个问题吗 如果你
  • 从列表中删除的随机样本

    我的列表中有数据 例如 L 3 4 5 1 4 5 1 2 3 1 2 3 我需要随机采样 2 的大小 所以我想使用 import random t1 random sample set L 2 现在 T1 是随机提取的值的列表 但我想从我
  • 正确使用io包中的stdout函数

    dart 中 io 包中的 stdout 函数的正确用法是什么 我写了这样一个脚本 import dart io void main print Hello World stdout 我得到以下输出 firen firen VirtualB
  • 使用 ajax 监听器时 Primefaces 对话框框架不工作

    我正在尝试使用 Primefaces 4 对话框框架打开对话框 public void openDialog String viewName RequestContext getCurrentInstance openDialog view
  • 用GDB读取寄存器指向的内存

    如果我知道内存位置 有没有办法从 GDB 查看内存内容 也就是说 我正在调试我为操作系统课程编写的 x86 汇编程序 现在 我正在尝试使用 C 和 Gas GNU 汇编程序 为 x86 上的 Linux 编写一个用户级线程库 我分配了自己的
  • PHPStorm 中未定义的类 DateTime

    我想使用类DateTime but PHPStorm我这么说 Undefined class DateTime 我的 PHP 版本是5 5 9 1 我使用的是 PHPStorm 版本2016 1我正在与Yii2 framework 如果它能
  • 在 R 中对整齐数据同时执行多个 t.test

    我有一个如下所示的数据集 id samediff factor value 1 S give 3 1 S impact 4 2 S give 2 2 S impact 5 3 D give 1 3 D impact 4 4 D give 3
  • 如何向 Kivy For Android 添加模块?

    我在 Android 设备上安装了 Kivy 但 help modules 显示未安装 PIL 模块 我怎样才能添加它 编辑 我的意思是 我安装了 kivy launcher 并编写了一个小型测试应用程序 它可以工作 现在 如果我的应用程序
  • 当我单击 li 标签时,它会获取数据值,但是当我插入它时,它具有空值

    单击时我得到 li 标签数据值 现在我需要使用插入回数据库的值 但它在我的数据库中显示空值 但我使用 console log 它显示了价值 如何获取值并插入数据库 mymoviemanagement php movie 的值为 null i
  • 如何在 PHP 中设置 cookie 然后重定向?

    进行一些处理后 我想为用户输入设置一个 cookie 值 然后将它们重定向到新页面 但是 cookie 尚未设置 如果我注释掉重定向 则 cookie 设置成功 我认为这是某种标题问题 对于这种情况 最好的解决方法是什么 if form s
  • 不同大小类别的不同表视图单元格行高?

    如何更改此 UITableViewController 自定义类以动态更改表视图单元格的高度 我为 iPad 和 iPhone 尺寸类别指定了不同的字体大小 这是之前与 rdelmar 讨论的延续 import CREWFoodWaterL
  • 计算POST内容长度

    如何计算内容长度 例如 POST Upload HTTP 1 1 Host test lan User Agent Shockwave Flash Connection Keep Alive Cache Control no cache A
  • 操作栏抽屉切换自定义图标

    我正在尝试使用操作栏抽屉切换 但我希望它显示的不仅仅是菜单图标 我希望它在自定义菜单图标的右上角显示通知计数 但我仍然希望操作栏抽屉式开关在需要时显示后退箭头 因此 我首先尝试查看是否可以在操作栏抽屉切换上显示自定义布局 包含菜单图标的图像
  • Guid.NewGuid() VS Random.Next() 的随机字符串生成器

    我和我的同事正在讨论使用哪种方法来自动生成用户 ID 和帖子 ID 以在数据库中进行识别 一个选项使用 Random 的单个实例 并采用一些有用的参数 以便它可以重用于各种字符串生成情况 即从 4 位数字 pin 到 20 位字母数字 id