【问题标题】:Srand with char array in C?Srand 在 C 中使用 char 数组?
【发布时间】:2014-04-13 01:03:51
【问题描述】:

如何在 C 中使用 char 数组而不是 int 随机种子?
我想使用密码,而不是数字,但srand 只接受整数。
有没有办法做到这一点?

【问题讨论】:

  • 一种方法是创建字符串的散列并将生成的整数用作种子。
  • @CPlusPlusOOAandD 再次阅读问题。这根本不是我要问的。
  • @yentup 在我看来,爱德华的回答是正确的,也就是说,使用哈希函数从您的密码中获取一个 int,并将该 int 用作 srand 的种子(将那个 int 传递给 srand) .
  • @Chnossos 你知道最好的散列函数吗?
  • srand((unsigned)strtoul("alphanums", NULL, 36));

标签: c random srand random-seed


【解决方案1】:

只需使用哈希函数。经典是hash_pjw

unsigned hash_pjw (const void *str)   
{
  const char *s = str;
  unsigned int g, h = 1234567u;
  while (*s != 0) {
    h = (h << 4) + *s++;
    if ((g = h & (unsigned int) 0xf0000000) != 0)
       h = (h ^ (g >> 24)) ^ g;
  }
  return h;
}

请注意,rand() 与加密安全完全不同。

【讨论】:

  • 是的,我知道。我正在为隐写术打乱图像中像素的坐标。它是安全的,因为被隐藏的数据字节被分成二进制文件,所以如果没有随机种子,就不可能知道如何重新排序数据。即使对于非常少量的数据,您也可以将其重新排序为您想要的任何内容。所以没有办法知道它应该以哪种方式重新排序。听起来对吗?
  • 我猜其中的漏洞可能是暴力破解的密码长度。
  • 为了防止暴力破解,我可以将密码哈希 65536 次或其他东西。
  • 好吧,我想我应该只是加密数据。
猜你喜欢
  • 1970-01-01
  • 2015-06-25
  • 1970-01-01
  • 2014-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
相关资源
最近更新 更多