Я пытаюсь получить sh одинарных std::string
и std::vector<std::string>
значений. Я следую за примерами из cppreference и boost . Когда код скомпилирован и запущен на Windows против Linux, я получаю другие результаты.
Файл заголовка для MyHasher.h
выглядит следующим образом.
class MyHasher {
private:
MyHasher() = delete;
public:
static std::size_t hash(std::vector<std::string> ids);
static std::size_t hash(std::string s);
static void hashCombine(std::size_t &seed, std::size_t value);
};
CPP file MyHasher.cpp
выглядит следующим образом.
std::size_t MyHasher::hash(std::vector<std::string> ids) {
std::size_t seed = 0;
for (auto id : ids) {
std::size_t h = std::hash<std::string>{}(id);
hashCombine(seed, h);
}
return seed;
}
std::size_t MyHasher::hash(std::string s) {
std::size_t seed = 0;
std::size_t h = std::hash<std::string>{}(s);
hashCombine(seed, h);
return seed;
}
void MyHasher::hashCombine(std::size_t &seed, std::size_t value) {
seed ^= value + 0x9e3779b9 + (seed<<6) + (seed>>2);
}
Пример программы затем выполняется следующим образом.
int main() {
std::cout << std::to_string(MyHasher::hash("0")) << " | 0" << std::endl;
std::cout << std::to_string(MyHasher::hash(std::vector<std::string>{"0"})) << " | 0" << std::endl;
std::cout << std::to_string(MyHasher::hash(std::vector<std::string>{"0", "1"})) << " | 0 1" << std::endl;
return 0;
}
On Linux (g ++ 7.4.0), вывод
2297668036269395695 | 0
2297668036269395695 | 0
10545066640295778616 | 0 1
Вкл. Windows (Visual Studio Community 2019, MSV C -14.0), вывод выглядит следующим образом.
12638135526163551848 | 0
12638135526163551848 | 0
1964774108746342951 | 0 1
Есть идеи по этому несоответствию?
Что я действительно хочу, так это способ всегда генерировать уникальный вывод ha sh, который зависит от ввода, но кроссплатформенный и фиксированной ширины. Ширина не важна, скажем так, но при условии, что она одинакова, независимо от входных данных.