【问题标题】:recasting a unsigned char array to an unsigned long array将无符号字符数组重铸为无符号长数组
【发布时间】:2012-10-23 01:44:15
【问题描述】:

好的,我正在使用原始 SHA1 哈希来播种 Mersenne Twister 伪随机数生成器 生成器让我可以选择使用 unsigned long 或 unsigned long 数组播种

我正在使用的 SHA1 类将哈希作为 20 字节的无符号字符数组提供给我

我想我可以将这个 chars 数组重铸为 longs 数组以获得工作种子,但我怎么知道得到的 longs 数组有多长?

示例代码:

CSHA1 sha1;
sha1.Update((unsigned char*)key, size_key);
sha1.Final();
unsigned char* hash;
sha1.GetHash(hash);

// Seed the random with the key
MTRand mt((unsigned long*)hash, <size of array of longs>);

我希望没有数据丢失(因为没有字节被丢弃),因为我需要它来保持加密安全

【问题讨论】:

    标签: c++ casting sha1 mersenne-twister


    【解决方案1】:

    你可以说

    sizeof(unsigned long) / sizeof(unsigned char)
    

    获取长字节的数量。

    但是,简单的投射有两个潜在的问题。

    首先,字符数组可能没有正确对齐。在某些处理器上,这可能会导致陷阱。在其他情况下,它只会减慢执行速度。

    其次,如果程序必须在不同的架构上以相同的方式工作,那么您会要求字节顺序问题。

    您可以通过将字节显式复制到 long 数组中来解决这两个问题。未经测试的代码:

    const int bytes_per_long = sizeof(unsigned long) / sizeof(unsigned char);
    unsigned long hash_copy[key_length_in_bytes / bytes_per_long];
    int i_hash = 0;
    for (int i_copy = 0; i_copy < sizeof hash_copy / sizeof hash_copy[0]; i_copy++) {
      unsigned long b = 0;
      for (int i_byte = 0; i_byte < bytes_per_long; i_byte++)
        b = (b << 8) | hash[i_hash++];
      hash_copy[i_copy] = b;
    }
    // Now use hash_copy.
    

    【讨论】:

    • 你是对的。谢谢。我有一个明确的文字副本(我刚刚替换了它)并将其删除。这是漫长的一天。
    【解决方案2】:

    您可以使用len_of_chars * sizeof(char) / sizeof(long),其中len_of_chars 大概是20。

    【讨论】:

    • @aib:当然可以,但是如果你把它留在里面,它会让你在做什么更明显。无论如何,编译器都会将表达式计算为常量。
    【解决方案3】:

    Your library 似乎假定为 32 位 unsigned longs,所以你这样做没有 [更多] 伤害。事实上,我会尽可能假设 8 位 unsigned chars 甚至可能两者都没有填充的小端表示。所以你可以使用简单的演员表(尽管我会使用reinterpret_cast),或者@Gene 的memcpy 样本进行对齐。

    然而,可移植代码* 应使用 &lt;cstdint&gt;,其中的 uint#_t 类型和分段的按值复制进行转换:

    uint32_t littleEndianInt8sToInt32(uint8_t bytes[4]) {
        return bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
    }
    

    ...还有更好的名字。抱歉,来晚了:)

    *:当然,stdint本身 不是很便携 (>= C++11) 并且不能保证精确宽度的类型在其中。讽刺。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 2018-04-07
    • 2012-05-10
    • 2014-03-18
    相关资源
    最近更新 更多