2年後,這是一個想法,在一個真正的應用程序(非常接近你所需要的)。
我只需要一個沒有非易失性存儲器的定製電路板只有48位的序列號。
該主板具有一個具有96位唯一ID(STM32_UUID)的STM32處理器。
下面是完整的C代碼:
#define STM32_UUID ((uint8_t*)0x1FFFF7E8)
// board SN 48 bit
static uint8_t BoardSerial[6];
void setBoardSerial(void)
{
uint64_t hash = fastHash64(STM32_UUID, 12, 1234554321);
memcpy(BoardSerial, &hash, 6);
}
static inline uint64_t mix(uint64_t h)
{
h ^= h >> 23;
h *= 0x2127599bf4325c37ULL;
h ^= h >> 47;
//
return h;
}
uint64_t fastHash64(const void * buf, size_t len, uint64_t seed)
{
const uint64_t m = 0x880355f21e6d1965ULL;
const uint64_t * pos = (const uint64_t*)buf;
const uint64_t * end = pos + (len/8);
const unsigned char * pos2;
uint64_t h = seed^(len * m);
uint64_t v;
while(pos != end)
{
v = *pos++;
h ^= mix(v);
h *= m;
}
pos2 = (const unsigned char*)pos;
v = 0;
switch(len & 7)
{
case 7: v ^= (uint64_t)pos2[6] << 48;
case 6: v ^= (uint64_t)pos2[5] << 40;
case 5: v ^= (uint64_t)pos2[4] << 32;
case 4: v ^= (uint64_t)pos2[3] << 24;
case 3: v ^= (uint64_t)pos2[2] << 16;
case 2: v ^= (uint64_t)pos2[1] << 8;
case 1: v ^= (uint64_t)pos2[0];
h ^= mix(v);
h *= m;
}
return mix(h);
}
我測試上一批次的約200個單位(板材)該溶液,絕對沒有問題,沒有任何衝突。
我見過很多人有這個問題,當他們需要一個較小的設備ID,以某種方式來源於大型獨特的單位序列號。
或者,您可以搜索的實現Bobcat 48位散列。
這似乎是https://serverfault.com/questions/299556/how-to-generate-a-random-mac-address-from-the-linux-command-line的副本 – Terry
@特里優秀!請注意,它們只能使用40位,並且只佔用最重要的40位。我不確定這種影響與其他方式的差異。但是謝謝你! – deitch