HASHES

# Hashes

Article by:

## Simple Hash Algorithms For Microcontrollers

The following code example comes from the GitHub repo canzero-driver-firmware.

/* * * *
* The pseudo hash below is loosely based on MD5.
* It aims the create a unique 8 byte ID from a 12 byte unique ID
* with low probability of collision.
* The previous approach of selecting certain bits for the 12 byte
* ID to create an 8 byte ID had an 2-3% collissions, which is not
* very big but could still become problematic.
*/

uint16_t K = {
0xa478, 0x0faf, 0x98d8, 0x1122,
0x2562, 0x105d, 0xcde6, 0xe905,
0x3942, 0xea44, 0x7ec6, 0xd039,
0x2244, 0x59c3, 0x7e4f, 0x7e82,
0xb756, 0xc62a, 0xf7af, 0x7193,
0xb340, 0x1453, 0x07d6, 0xa3f8
};

int s = { 7, 12,  1, 6,
5,  9, 14, 2,
4, 11,  0, 3,
8, 10, 15, 13 };

static uint16_t lrot(uint16_t v, int r)
{
return (v<<r) | (v>>(16-r));
}

static void pseudo_hash(uint16_t *src, uint16_t *dst)
{
uint16_t A, B, C, D;

A = 0x2301;
B = 0xab89;
C = 0xdcfe;
D = 0x5476;

for (int i=0; i<16; i++)
{
uint16_t R, p;

if (i<6) {
R = (B & C) | ((~B) & D);
p = i;
}

else if (i<8) {
R = (B & D) | (C & (~D));
p = (5*i+1)%6;
}

else if (i<12) {
R = B ^ C ^ D;
p = (3*i+5)%6;
}

else {
R = C ^ (B | (~D));
p = (2*i)%6;
}

R = R + A + K[i] + src[p];
A = D;
D = C;
C = B;
B = B + lrot(R, s[i]);
}

dst = A;
dst = B;
dst = C;
dst = D;
}


## Authors 