Per le strutture in cui l'uguaglianza indica l'uguaglianza di tipo e byte più derivato identico di ciascun membro dati, quando, se possibile, la struttura può essere sottoposta a hash in modo sicuro come una matrice di byte?Quando una struct può essere sottoposta a hashing sicuro come una matrice di byte?
Questo documento
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3333.html
alla voce "Hashing oggetti come array di byte" suggerisce che le strutture con imbottitura non possono essere hashing sicuro come una matrice di byte.
È un test esplicito per il riempimento richiesto per hash in modo sicuro una struttura come una matrice di byte? È sufficiente?
In tal caso, il seguente schizzo illustra correttamente tale test?
#include <cstddef>
#include <iostream>
struct A
{
int i;
float f;
char c;
};
// hashing would start at offs_i (possibly hopping over a v-table) and end at
// offs_c + sizeof(char)
int main()
{
const std::size_t size_A = sizeof(A);
const std::size_t size_int = sizeof(int);
const std::size_t size_float = sizeof(float);
const std::size_t size_char = sizeof(char);
const std::size_t offs_i = offsetof(A, i);
const std::size_t offs_f = offsetof(A, f);
const std::size_t offs_c = offsetof(A, c);
bool padded = false;
if (offs_f != size_int)
padded = true;
else if (offs_c != size_int + size_float)
padded = true;
std::cout << "padded? " << std::boolalpha << padded << std::endl;
}
Se una struct ha imbottitura, non v'è alcun modo per soluzione per consentire hashing come una matrice di byte, ad esempio azzerando i bit di riempimento?
"Sicuro" qui indica due strutture che confrontano lo stesso hash con valori identici.
Che cosa ti impedisce di eseguire l'hashing semantico e membro-saggio come tutti gli altri? –
@LightnessRacesinOrbit Come crei una funzione che hash un tipo di struct generico? – Shoe
Non lo faresti, perché non ha senso. – Puppy