- Si realmente no te preocupa la seguridad
- Si todo lo que quieres hacer es 'arruinar' un número
Luego hay un montón de formas realmente simples de hacer esto, aquí hay dos que puedo pensar:
void really_simple_hash(uint16_t x)
{
SWAP_NIBBLES(FIRST_BYTE(x));
SWAP_NIBBLES(SECOND_BYTE(x));
x ^= 0xAAAA;
return x;
}
En un PIC18, esto se traduce en un código muy simple:
SWAPF x, f
SWAPF x+1, f
movlw 0xAA
xorwf x, f
xorwf x+1, f
Es bastante liviano con un tiempo de ejecución de solo 5uS en un PIC18 que se ejecuta en 10MIPS. Si eso no es suficiente de un lío, puedes barajar los bits en el número. De nuevo, en un PIC18:
rrcf x, f ; Then we take each bit of the source word
rlcf y+1, f ; and shift it into one of the destination bytes
rrcf x+1, f
rlcf y, f ; There are:
rrcf x, f ; - eight right shifts of x,
rlcf y+1, f ; - eight right shifts of x+1,
rrcf x+1, f ; - eight left shifts of y,
rlcf y+1, f ; - eight left shifts of y+1,
rrcf x, f
rlcf y, f ; You can do them in whatever sequence you want
rrcf x+1, f
rlcf y, f
rrcf x, f
rlcf y+1, f
rrcf x, f
rlcf y, f
rrcf x, f
rlcf y, f
rrcf x, f
rlcf y+1, f
rrcf x+1, f
rlcf y, f
rrcf x, f
rlcf y+1, f
rrcf x+1, f
rlcf y+1, f
rrcf x, f
rlcf y, f
rrcf x+1, f
rlcf y, f
rrcf x, f
rlcf y+1, f
rrcf x, f
rlcf y, f
rrcf x, f
rlcf y, f ; Finally, the result is stored in y
Todavía es bastante liviano, con un tiempo de ejecución de solo 37 uS para el mismo PIC18.