私は、std::unordered_map
のために使用できるように6バイトのフィールドをハッシュする効率的な方法を探しています。6バイトのフィールドからハッシュを計算しますか?
私は、これはハッシュを作成する従来の方法だろうと思う:
struct Hash {
std::size_t operator()(const std::array<uint8_t, 6> & mac) const {
std::size_t key = 0;
boost::hash_combine(key, mac[0]);
boost::hash_combine(key, mac[1]);
boost::hash_combine(key, mac[2]);
boost::hash_combine(key, mac[3]);
boost::hash_combine(key, mac[4]);
boost::hash_combine(key, mac[5]);
return key;
}
};
しかし、私はこのトリックを使用して(〜20%)私はそれが少し速く作ることができることに気づいた。
struct Hash {
std::size_t operator()(const std::array<uint8_t, 6> & mac) const {
std::size_t key = 0;
// Possibly UB?
boost::hash_combine(key, reinterpret_cast<const uint32_t&>(mac[0]));
boost::hash_combine(key, reinterpret_cast<const uint16_t&>(mac[4]));
return key;
}
};
そして、これはより速くだった:
struct Hash {
std::size_t operator()(const std::array<uint8_t, 6> & mac) const {
// Requires size_t to be 64-bit.
static_assert(sizeof(std::size_t) >= 6, "MAC address doesn't fit in std::size_t!");
std::size_t key = 0;
// Likely UB?
boost::hash_combine(key, 0x0000FFFFFFFFFFFF & reinterpret_cast<const uint64_t&>(mac[0]));
return key;
}
};
私の質問は二つある:
- UBではこれらの最適化が行われますか?
- 私の最初の解決方法はありますか?それとも良い方法がありますか?
UBとは何ですか? "UBの結果"?たぶん私はもう1杯のコーヒーが必要で、何かを忘れているかもしれません。 –
@MarkWilkins:未定義の動作。 –
'boost :: hash_combine(key、mac [0] |(mac [1] << 8)|(max [2] << 16)|(max [3] << 24))などです。 –