【问题标题】:How to generate Random number of 12 bytes?如何生成 12 字节的随机数?
【发布时间】:2013-02-07 06:03:24
【问题描述】:

我正在用 C 语言开发 linux 上的项目,我需要在其中生成 12 个字节的随机数。 我在互联网上搜索过,但除了 srand 或 random 函数之外我找不到任何其他功能。 但这些函数只能生成 32 位(4 字节)的随机数。

我正在寻找生成 12 字节的随机数。

有人知道 linux 上提供此功能的任何库吗?

【问题讨论】:

  • 4字节数你用的是什么方法
  • 如果我的数学正确,12 = 3*4
  • "有人知道 linux 上提供此功能的任何库吗?" - 当然,标准库。
  • 对你来说有多少个 12 字节? C 本身没有这种类型......所以用或多或少的随机字节填充数据。而且您没有说明您希望这些数据有多随机。
  • 大家好,很抱歉回复晚了,但由于健康问题,我在发布问题后无法工作。顺便说一句,谢谢大家的回复。这是我关于stackoverflow的第一个问题。 :) @Nemo:是的,我也在考虑生成 3 个随机数并填充我的 12 字节缓冲区 @H2CO3:我在询问标准库中的常规功能。 //@Basile:是的,你是对的。我每次都想要随机数,因为它应该用于跟踪服务器/客户端之间的数据包请求/回复。

标签: c linux


【解决方案1】:

好的,最后一个解决方案:

unsigned char buf[12];
int i;
srand(time(NULL));
for (i = 0; i < sizeof(buf); i++) {
    buf[i] = rand() % 256;
}

(是的,我使用的是模数 - 如果您关心均匀分布,请不要使用它。)

【讨论】:

  • 感谢您提供建议。我需要检查这是否符合我的要求,因为我必须使用所有 12 个字节的随机数作为唯一编号来跟踪服务器/客户端之间的数据包。
  • @SujalSheth 也许如果您指定了您的要求...,那么这就是所谓的“XY 问题”。那你为什么不简单地使用 libuuid 呢?
  • 我不能使用使用 rand() 调用生成的每个字节,因为这会影响性能。
  • @SujalSheth 然后选择一种原生支持 12 字节整数的语言。 C 没有。 (顺便说一句,这过早的优化。)
  • 您使用 srand 进行播种,但使用 rand 生成随机数。因此,播种不会影响随机数的生成。
【解决方案2】:

您没有说明 12 个随机字节对您意味着什么,以及您为什么需要它们。

你应该阅读random(4)然后也许是代码

unsigned char myrandbytes[12];
FILE* fr = fopen("/dev/urandom", "r");
if (!fr) perror("urandom"), exit(EXIT_FAILURE);
fread(myrandbytes, sizeof(char), 12, fr);
fclose(fr), fr = NULL;

但很多时候,按照that answer 中的建议使用rand(3) 就足够了。您也可以使用random(3)lrand48(3)。我通常对 random(3) 感到满意,我通常会播种 -e.g.使用srandominitstate,在开始时读取/dev/urandom

由于您没有告诉我们为什么需要随机数,我们无法提供更多帮助。

如果随机数的质量非常重要(例如,用于强加密目的),它可能比您想象的要困难得多,并且它取决于系统和硬件(再次阅读 random(4) 页面)。

【讨论】:

  • 我需要使用这个随机数来跟踪服务器/客户端之间的数据包。这个随机数必须是唯一的,这样每个数据包都可以单独追踪。
  • 为了更准确和简洁,客户端生成这个随机数(唯一的 12 字节数)作为它的身份,并与请求数据包一起发送到服务器。服务器使用这个数字来识别它正在与哪个客户端交谈。稍后服务器使用这个数字通知客户端有几个更新。
猜你喜欢
  • 2018-04-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-04
相关资源
最近更新 更多