C++ - Hash/Map 单个 uint64_t 中的 std::vector<uint64_t>
C++ - Hash/Map a std::vector<uint64_t> in a single uint64_t
我需要将 std::vector<uint64_t>
映射到单个 uint64_t
。有可能吗?我想使用哈希函数。这是一个解决方案吗?
例如,这个向量:
std::vector<uint64_t> v {
16377,
2631694347470643681,
11730294873282192384
}
应该转换成一个uint64_t
。
如果哈希函数不是一个好的解决方案(例如,高冲突百分比),是否有替代方案来执行此映射?
您可以创建一个 std::map<std::vector<uint64_t>, uint64_t>
,为您的向量创建一个比较函数,然后在递增计数器的同时将它们添加到地图中。
该计数器将是您的 hash
值。
上面代码中的注释:
#include <array>
#include <algorithm>
#include <vector>
#include <iostream>
static std::array<size_t,5> primes = { 3,5,7,11,13 };
static std::uint64_t hash(const std::vector<std::uint64_t>& v)
{
std::uint64_t hash = v[0];
for (size_t n = 1; n < std::min(primes.size(), v.size()); ++n) hash += (primes[n]*v[n]);
return hash;
}
int main()
{
std::vector<uint64_t> v{ 16377, 2631694347470643681, 11730294873282192384 };
std::cout << hash(v);
return 0;
}
I need to hash a std::vector<uint64_t> to a single uint64_t. It is possibile to do?
是的,可变长度哈希函数存在,并且可以用 C++ 实现它们。
C++ 标准库附带了一些散列函数,但不幸的是不是用于矢量(除了 bool 专业化)。我们可以重用为字符串视图提供的哈希函数,但这有点麻烦:
const char* data = reinterpret_cast<const char*>(v.data());
std::size_t size = v.size() * sizeof(v[0]);
std::hash<std::string_view> hash;
std::cout << hash(std::string_view(data, size));
请注意,只有在 std::has_unique_object_representations_v
元素类型为 vector 的情况下才合理。我认为假设 std::uint64_t
.
就是这种情况是合理的
使用标准库哈希函数时需要注意的是,它们没有确切的规范,因此您不能依赖不同系统之间的哈希值是相同的。如果担心的话,您应该使用另一个哈希函数。
我需要将 std::vector<uint64_t>
映射到单个 uint64_t
。有可能吗?我想使用哈希函数。这是一个解决方案吗?
例如,这个向量:
std::vector<uint64_t> v {
16377,
2631694347470643681,
11730294873282192384
}
应该转换成一个uint64_t
。
如果哈希函数不是一个好的解决方案(例如,高冲突百分比),是否有替代方案来执行此映射?
您可以创建一个 std::map<std::vector<uint64_t>, uint64_t>
,为您的向量创建一个比较函数,然后在递增计数器的同时将它们添加到地图中。
该计数器将是您的 hash
值。
上面代码中的注释:
#include <array>
#include <algorithm>
#include <vector>
#include <iostream>
static std::array<size_t,5> primes = { 3,5,7,11,13 };
static std::uint64_t hash(const std::vector<std::uint64_t>& v)
{
std::uint64_t hash = v[0];
for (size_t n = 1; n < std::min(primes.size(), v.size()); ++n) hash += (primes[n]*v[n]);
return hash;
}
int main()
{
std::vector<uint64_t> v{ 16377, 2631694347470643681, 11730294873282192384 };
std::cout << hash(v);
return 0;
}
I need to hash a std::vector<uint64_t> to a single uint64_t. It is possibile to do?
是的,可变长度哈希函数存在,并且可以用 C++ 实现它们。
C++ 标准库附带了一些散列函数,但不幸的是不是用于矢量(除了 bool 专业化)。我们可以重用为字符串视图提供的哈希函数,但这有点麻烦:
const char* data = reinterpret_cast<const char*>(v.data());
std::size_t size = v.size() * sizeof(v[0]);
std::hash<std::string_view> hash;
std::cout << hash(std::string_view(data, size));
请注意,只有在 std::has_unique_object_representations_v
元素类型为 vector 的情况下才合理。我认为假设 std::uint64_t
.
使用标准库哈希函数时需要注意的是,它们没有确切的规范,因此您不能依赖不同系统之间的哈希值是相同的。如果担心的话,您应该使用另一个哈希函数。