Di seguito è riportata l'implementazione della funzione hash della libreria roguewave. Restituisce un hash a 32 bit. L'operazione di base è A = B ^ ((C < < 5) | (C > > 27)). Questo hash è sicuro da usare come controllo della password o è possibile recuperare tutti i B usati invertendoli?
const unsigned RW_HASH_SHIFT = 5;
inline static void mash(unsigned& hash, unsigned chars)
{
hash = (chars ^
((hash << RW_HASH_SHIFT) |
(hash >> (RWBITSPERBYTE*sizeof(unsigned) - RW_HASH_SHIFT))));
}
unsigned
RWCStringRef::hash() const
{
unsigned hv = (unsigned)length(); // Mix in the string length.
unsigned i = length()*sizeof(char)/sizeof(unsigned);
const unsigned* p = (const unsigned*)data();
{
while (i--)
mash(hv, *p++); // XOR in the characters.
}
// XOR in any remaining characters:
if ((i = length()*sizeof(char)%sizeof(unsigned)) != 0) {
unsigned h = 0;
const char* c = (const char*)p;
while (i--)
h = ((h << RWBITSPERBYTE*sizeof(char)) | *c++);
mash(hv, h);
}
return hv;
}