2011-12-13 65 views
2

爲了創建批量虛擬機,我需要在Python中創建一個隨機MAC地址生成器。我不知道如何生成隨機MAC地址。python中的MAC地址生成器

以下程序是否正確?

import random 

# The first line is defined for specified vendor 
mac = [ 0x00, 0x24, 0x81, 
    random.randint(0x00, 0x7f), 
    random.randint(0x00, 0xff), 
    random.randint(0x00, 0xff) ] 

print ':'.join(map(lambda x: "%02x" % x, mac)) 
+1

您是否試圖特別生成[MAC地址](http://en.wikipedia.org/wiki/MAC_address)? – sarnold

+0

是製造特定的 –

+0

該示例程序適用於單個MAC地址,但它存在真正的風險,您將爲多臺機器生成相同的僞MAC地址,這可能會導致奇怪的網絡問題。 – sarnold

回答

1

由於獨特性是你應該關心的(除了使合式的地址),我會擔心的MSB的OUI,並在特定的網卡使用的字節序列。地址分配對您的應用程序可能並不重要(即使某些NIC或交換機實現可能將它們用作散列輸入,這可能不是一個大問題)。

可能想要考慮使用「本地管理的」flag in the OUI以避免與現有設備製造商發生衝突。

避免陷入像設置多播位(你的例子)。

0

爲了避免重複:

如果你要產生這樣的MAC地址的大量(上百萬),你可能想生成MAC的的有序列表,喂的是一個線性隨機過程( GNU排序-R應該做的很好 - 我不認爲它在線性時間這樣做,但它有類似的最終結果)一次,然後根據需要將新的地址從隨機列表的一端拖出。我相信這樣的清單應該適合大約34兆字節。

如果您只需要數千個,您最好使用已經選定的值來維護文本文件,然後檢查是否存在衝突,並隨時添加新值。這是一種比較慢的算法,但它的開銷要小得多,所以對於較少數量的mac地址,它應該仍然是一個贏。

順便說一句,如果第4個八位字節(從1開始編號從左開始)是0-ff而不是0-7f?我看到在維基百科頁面沒有出現的1408米或127 MAC地址: http://en.wikipedia.org/wiki/MAC_address

0

mamofish's code修改到Python3:

mac = '00:00:00:' 
for number in range(16**6): 
    hex_num = hex(number)[2:].zfill(6) 
    print("{}{}{}:{}{}:{}{}".format(mac,*hex_num)) 

生成MAC地址從00:00:00:00:00:0000:00:00:ff:ff:ff字符串。

0

任何人想要生成自己的MAC地址(一個很好的例子是VM網卡),你可能只是想這樣的:

"02:00:00:%02x:%02x:%02x" % (random.randint(0, 255), 
          random.randint(0, 255), 
          random.randint(0, 255)) 

或者,如果你想這樣做的unix'y殼,此作品多次在:

printf '02:00:00:%02X:%02X:%02X\n' $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) 

這給你一個單播MAC地址,它是100%安全的環境中使用,而不是踐踏任何人的註冊MAC地址空間。


更多細節...

最高字節(0×02),給你一個本地管理的單播地址,這可能是你想要什麼,如果你打的如何生成計算器的底部兩位這個。:)

如果MAC地址是而不是本地管理,這意味着它應該是「全球唯一」。此類MAC地址在IEEE中集中註冊,並且您應該擁有由IEEE頒發給您的唯一OUI(組織唯一標識符)。請參閱this鏈接獲取OUI值的全局註冊表。這個OUI值結束於前3個字節(或者僅僅是前22個位)。

MAC地址並不複雜,所以你應該也許只是看看定義。維基百科有a good one