You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows系统下os.urandom()是否始终调用win32_urandom?

Windows下os.urandom()是否始终调用CryptGenRandom()?

背景

在CPython 3.7中,os.urandom()会调用bootstrap_hash.c文件里的_PyOS_URandom()函数,该函数又会调用同文件的pyurandom函数。pyurandom函数上方的注释提到它会按优先级尝试四个随机数生成函数,其中第一个是Windows平台的CryptGenRandom(),由此产生疑问:Windows系统下,该函数是否始终使用CryptGenRandom(),还是会在调用失败后尝试另外三个函数?

代码分析与结论

从pyurandom函数的开头实现可以明确:

static int
pyurandom(void *buffer, Py_ssize_t size, int blocking, int raise)
{
#if defined(PY_GETRANDOM) || defined(PY_GETENTROPY)
    int res;
#endif

    if (size < 0) {
        if (raise) {
            PyErr_Format(PyExc_ValueError,
                         "negative argument not allowed");
        }
        return -1;
    }

    if (size == 0) {
        return 0;
    }

#ifdef MS_WINDOWS
    return win32_urandom((unsigned char *)buffer, size, raise);

当代码在Windows平台编译时,MS_WINDOWS宏会被定义,此时pyurandom函数会直接调用win32_urandom并返回其结果,不会执行后续其他平台的代码分支。

而win32_urandom函数内部就是对Windows系统API CryptGenRandom()的封装,且如果win32_urandom调用失败,会直接返回错误状态,不会回到pyurandom函数去尝试另外三个非Windows平台的函数。

结论:在Windows系统下,os.urandom()对应的底层实现始终会优先调用CryptGenRandom(),不会在调用失败后尝试另外三个函数。

内容的提问来源于stack exchange,提问作者Riemann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 06:01:04