2015-08-27 50 views
1

是否有任何簡單的使用散列算法來生成48位散列?我需要從唯一的輸入字符串生成唯一的MAC地址。這裏沒有安全問題,只是將它映射到MAC地址空間(即48位)的問題。我想過CRC32,它只有32位,並且很容易(而且cksum在每個Linux上),並且將它們用於較低的32位,但是如果它是多於幾個主機,則衝突相當高。我可以使用什麼算法爲唯一的mac地址生成48位散列?

如果我能得到48位散列,我可以屏蔽8個最高有效位的第二個最低有效位,以確保它是本地管理地址。單個位的丟失很小。相反,我可以使用更長的哈希算法(MD5,SHA1等),只需要48位最重要或最不重要的位。

有沒有簡單的方法來做到這一點?

我的首選是命令行實用程序,但如果我必須編寫短python或類似的,沒有什麼大不了的。

+0

這似乎是https://serverfault.com/questions/299556/how-to-generate-a-random-mac-address-from-the-linux-command-line的副本 – Terry

+0

@特里優秀!請注意,它們只能使用40位,並且只佔用最重要的40位。我不確定這種影響與其他方式的差異。但是謝謝你! – deitch

回答

1

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位散列

相關問題