- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Intel Ivy Bridge CPU 并想在 C# 中使用 RDRAND 操作码 ( https://software.intel.com/en-us/articles/intel-digital-random-number-generator-drng-software-implementation-guide )。
如何通过 C# 调用此 CPU 指令?我在这里看到了从 c# 执行汇编代码的示例:x86/x64 CPUID in C#
但我不确定如何将它用于 RDRAND。代码不需要检查执行代码的 CPU 是否支持该指令。
我看过这个执行来自 drng_samples 的汇编字节码的 C++ 示例英特尔:
int rdrand32_step (uint32_t *rand)
{
unsigned char ok;
/* rdrand edx */
asm volatile(".byte 0x0f,0xc7,0xf0; setc %1"
: "=a" (*rand), "=qm" (ok)
:
: "edx"
);
return ok;
}
在C#中执行汇编代码的示例如何与来自英特尔drng
示例代码的C++代码结合起来?
最佳答案
关于 SO 的答案将在运行时生成(非托管)汇编代码,供托管代码回调。这一切都非常有趣,但我建议您为此目的简单地使用 C++/CLI,因为它旨在简化互操作场景。创建一个新的 Visual C++ CLR 类库并给它一个单独的 rdrandwrapper.cpp
:
#include <immintrin.h>
using namespace System;
namespace RdRandWrapper {
#pragma managed(push, off)
bool getRdRand(unsigned int* pv) {
const int max_rdrand_tries = 10;
for (int i = 0; i < max_rdrand_tries; ++i) {
if (_rdrand32_step(pv)) return true;
}
return false;
}
#pragma managed(pop)
public ref class RandomGeneratorError : Exception
{
public:
RandomGeneratorError() : Exception() {}
RandomGeneratorError(String^ message) : Exception(message) {}
};
public ref class RdRandom
{
public:
int Next() {
unsigned int v;
if (!getRdRand(&v)) {
throw gcnew RandomGeneratorError("Failed to get hardware RNG number.");
}
return v & 0x7fffffff;
}
};
}
这是一个非常简单的实现,它只是试图模仿 Random.Next
来获取单个非负随机整数。根据问题,它不会尝试验证 RDRAND
在 CPU 上是否实际可用,但它确实处理了指令存在但无法工作的情况。 (这在当前硬件上“不可能发生”,除非它坏了,详情 here。)
生成的程序集是一个混合程序集,可由托管 C# 代码使用。确保将程序集编译为 x86 或 x64,与非托管代码相同(默认情况下,项目设置为编译为“任何 CPU”,这将无法正常工作,因为非托管代码只有一个特定的位数)。
using System;
using RdRandWrapper;
class Program {
static void Main(string[] args) {
var r = new RdRandom();
for (int i = 0; i != 10; ++i) {
Console.WriteLine(r.Next());
}
}
}
我对性能没有任何要求,但它可能不是很好。如果您想通过这种方式获得许多随机值,您可能需要 Next(int[] values)
重载以在一次调用中获得许多随机值,以减少互操作的开销。
关于c# - 如何在 .Net 中使用内联汇编来使用英特尔的 RDRAND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45460146/
今天我想:好吧,即使对 NIST SP 800-90A 的 RDRAND 实现存在很大怀疑。 ,它仍然是伪随机数生成器(PRNG)的硬件实现,对于非敏感应用程序来说必须足够好。所以我想在我的游戏中使用
我正在看H.J. Lu的PATCH: Update x86 rdrand intrinsics 。我不知道是否应该使用 _rdrand_u64、_rdrand64_step,或者是否还有其他函数。似乎
最近的英特尔芯片(Ivy Bridge 及更高版本)具有生成(伪)随机位的指令。 RDSEED输出从芯片上传感器收集的熵生成的“真实”随机位。 RDRAND输出由真随机数生成器播种的伪随机数生成器生成
我正在使用 Intel Ivy Bridge CPU 并想在 C# 中使用 RDRAND 操作码 ( https://software.intel.com/en-us/articles/intel-d
我看到英特尔似乎包含了一个新的汇编函数来获取从硬件获得的真实随机数。指令的名称是 RdRand,但在 Internet 上似乎只有少量细节可以访问:http://en.wikipedia.org/wi
英特尔 C++ 编译器和/或 GCC 是否支持以下 Intel intrinsics ,就像 MSVC 自 2012/2013 年以来所做的那样? #include // for the foll
我有这个函数(RDRand - 由 David Heffernan 编写)在 32 位中接缝工作正常,但在 64 位中失败: function TryRdRand(out Value: Cardina
我想在 Windows 上利用英特尔的 RDRAND 功能并生成真正的随机数(因为 Python 的随机模块不是那么随机)。 Python 中有没有可以访问此功能的 API? 我尝试安装下面评论中提到
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
这是我的代码: #include int main(){ BIGNUM *bne = NULL; unsigned long e = RSA_F4; RSA *r = NUL
我看到英特尔似乎包含了一个新的汇编函数来获取从硬件中获取的真实随机数。该指令的名称是 RdRand,但在 Internet 上似乎只能找到少量详细信息:http://en.wikipedia.org/
我正在尝试使用 Intel 的 RDRAND 指令。根据Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2
我正在 Visual Studio 2008 IDE 中处理一个 C++ 项目,我需要在其中使用英特尔的新 RDRAND操作说明。我进行了快速搜索,MSDN 建议使用 _rdrand64_step i
有一个英特尔 DRNG 库允许您使用基于处理器的晶体熵效应的随机数生成器。 库本身及其使用说明:https://software.intel.com/en-us/articles/intel-digi
我是一名优秀的程序员,十分优秀!