gpt4 book ai didi

c++ - 使用不同的编译器计算 std::hash

转载 作者:行者123 更新时间:2023-12-03 14:20:51 25 4
gpt4 key购买 nike

我需要在 windows 和 linux 中计算一个大字符串的哈希值,两个操作系统的结果应该是相同的。
对于一个简单的测试代码,我使用 std::hash 为 windows 和 linux 获得了不同的哈希值。这是有道理的,因为每个编译器的 std::hash 的实际实现可能使用不同的算法。
这带来了一个问题:有没有办法使用标准库来实现这一目标?
对我来说更直接的答案是实现我自己的哈希算法,所以它对两个操作系统都是一样的。但这似乎有点矫枉过正。我不想重新发明轮子。

最佳答案

标准库中的哈希算法不是固定的,在不同的平台/编译器上可能会有所不同。
但是您可以使用非常短且快速的 FNV1a 算法进行散列,只需几行代码即可实现,见下文。你可以阅读它here .
它会在所有机器上给出相同的结果。但是您必须修复 32 位或 64 位参数集(32 位参数在我的代码中被注释掉了)。
Try it online!

#include <iostream>
#include <string>
#include <cstdint>

inline uint64_t fnv1a(std::string const & text) {
// 32 bit params
// uint32_t constexpr fnv_prime = 16777619U;
// uint32_t constexpr fnv_offset_basis = 2166136261U;

// 64 bit params
uint64_t constexpr fnv_prime = 1099511628211ULL;
uint64_t constexpr fnv_offset_basis = 14695981039346656037ULL;

uint64_t hash = fnv_offset_basis;

for(auto c: text) {
hash ^= c;
hash *= fnv_prime;
}

return hash;
}

int main() {
std::cout << fnv1a("Hello, World!") << std::endl;
}
输出:
7993990320990026836

关于c++ - 使用不同的编译器计算 std::hash,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66764096/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com