XXH64函数在调试模式和发布模式下有不同的值

问题描述 投票:0回答:1
XXH_PUBLIC_API unsigned long long XXH64(const void* input, size_t len, unsigned long long seed)
{
#if 0
    /* Simple version, good for code maintenance, but unfortunately slow for small inputs */
    XXH64_state_t state;
    XXH64_reset(&state, seed);
    XXH64_update(&state, input, len);
    return XXH64_digest(&state);
#else
    XXH_endianess endian_detected = (XXH_endianess)XXH_CPU_LITTLE_ENDIAN;

    if (XXH_FORCE_ALIGN_CHECK) {
        if ((((size_t)input) & 7) == 0) {  /* Input is aligned, let's leverage the speed advantage */
            if ((endian_detected == XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
                return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_aligned);
            else
                return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_aligned);
        }
    }

    if ((endian_detected == XXH_littleEndian) || XXH_FORCE_NATIVE_FORMAT)
        return XXH64_endian_align(input, len, seed, XXH_littleEndian, XXH_unaligned);
    else
        return XXH64_endian_align(input, len, seed, XXH_bigEndian, XXH_unaligned);
#endif
}

这是 XXH64 哈希函数 (http://www.opensource.org/licenses/bsd-license.php)

当我在发布模式和调试模式下运行代码时

char buf[65];
unsigned int hash2 = 0;

sprintf(buf, "%I64u", (unsigned long long)_message);

unsigned long long hash = XXH64(buf,sizeof(buf)-1,0);
hash = hash % _n;
hash2 = (unsigned int)hash;
printf("message's hash value : %u \n", hash2);

每种模式都有不同的哈希值和相同的代码。

hash release-mode debug-mode
1个回答
0
投票

您的格式说明符为

%I64u
,它是一个 64 位整数。这与
(unsigned long long)
演员阵容相匹配。

但是,最大的 64 位数字是 18446744073709551615,因此它可以容纳 20 个字符,即

sprintf()
将最多填充您保留的 65 个字节中的 20 个。

在调试版本中,

buf[]
使用
\0
进行初始化,而在发布版本中则根本不进行初始化。访问未初始化的内存会导致未定义的行为(根据标准),因此任何事情都可能发生。实际上,您可能只是获得剩余字节的随机值,从而产生不同的哈希值。

如何修复?

sprintf()
返回实际写入的字节数。使用
sizeof(buf)
的返回值代替
sprintf()

© www.soinside.com 2019 - 2024. All rights reserved.