我从这里下载了isaac64,但在使用时遇到了一些问题。 我必须注释 isaac64.c 中的部分代码,因为它包含 main 函数。但我无法使用它......我无法正确初始化它并获取随机数,你能帮助我吗?我找不到任何例子。
randinit(TRUE);
for(i=0;i<10;i++) {
printf("%lx\n",rand());
}
每次运行此代码时,我都会得到相同的值。我不知道如何设置种子。
此版本的 ISAAC 是一个“参考实现”,这意味着它旨在被引用,但不是特别用户友好或不适合生产。 C 中有许多更易于使用的“加密安全随机数生成器”。特别是,在大多数操作系统上,只需从 /dev/random 读取字节就足够了。
main
函数演示了如何使用该库。它已经用
#ifdef
注释掉了。 我发现使用 ISAAC 周围的 Perl 包装器作为指南也有帮助。
int main()
{
/* Initialize the structure to 0 */
randctx ctx;
ctx.randa = ctx.randb = ctx.randc = (ub4)0;
/* Initialize the seed */
for (ub4 i=0; i<256; ++i) {
ctx.randrsl[i] = i;
}
/* Initialize the random numbers from the seed */
randinit(&ctx, TRUE);
/* Print 10 pseudo random numbers */
for(int i=0; i<10; i++) {
printf("%.8lx\n", rand(&ctx));
}
}
您必须提供seed
,或“熵”。如果您提供相同的种子,您将得到相同的结果。这就是为什么 ISAAC 是一个“伪”随机数生成器,它只能从现有的随机性中产生更多看似随机的数字。 Math::Random::ISAAC 中讨论了从哪里获取种子。 如果这些对您来说是新概念,并且如果这是生产代码,我会强烈建议您直接阅读
/dev/random
。这个 ISAAC 实现非常粗糙,而且密码学“非常容易”出错。 /dev/random
已经为你处理好这一切了。
如果您必须使用自己的伪随机库,请使用实施良好且记录良好的库,例如 OpenSSL。
如果您要完成此操作,我建议您调整Perl 包装器中的代码版本,因为至少作者已对其进行了清理,使其值得发布。