2013-06-20 17 views
1

我識別因特網流量通過流5元組(源IP,目標端口,體育,DPORT,傳輸協議號),我希望把這個5-元組變爲更緊湊的字母數字ID供我的腳本內部使用。識別5元組流通過散列值在Python

我在Python中有什麼選擇?

我讀了內置函數hash只是一致的明智的,所以我寧願別的東西。

我將永遠不得不處理不超過幾百不同的五元組。

+1

更糟的是,'hash'是不是在一些版本在同樣的程序的多個運行均勻一致(哈希隨機化)。 – delnan

+0

簡單的編碼如'str(flow)'和'base64encode(flow)'是字母數字和唯一的。哈希通常需要比這樣一個短的元組本身更多的空間,所以你爲什麼要它們? –

+0

我還希望用戶在想要對其執行某些功能時使用字母數字字符串來引用流。基本上,我希望我的腳本將輸入的流的ID或更多流的ID作爲輸入,並且使用整個5元組會很麻煩 –

回答

1

只要選擇你自己的散列函數:

import hashlib 
hash = hashlib.md5() 
t = (1, 2, 3, 4, 5) # whatever 
t_as_string = str(t) 
hash.update(t_as_string) 
print hash.hexdigest() 

可以在hashlib使用任何功能。由於這不是一個安全問題,所以哪一個並不重要...

但是:想要下注,比較元組將會更快/更高效嗎?

+0

謝謝。我想最後一行是'hash.hexdigest()',對吧?還有一件事:就我從文檔中可以看出來的,每次我想計算一個散列時,我都必須調用構造函數hashlib.md5(),否則它只會將一個新的字符串連接到前一個並計算結果散列值。它是否正確? –

+0

@RickyRobinson,更正(關於調用你想要計算的每個散列的構造函數),更正(關於我的代碼中的錯誤),謝謝 –

1

你是否擔心跨操作系統的衝突?這是你的問題嗎?

不過既然你只與5tuples幾百處理不能應用某種哈希勾結分辨率技術,如鏈接或打開地址等

如果我不缺什麼我相信上面的方法是比自己設計新的散列算法更好。

+0

我唯一擔心的是,我可能想傾倒流量,並在一臺機器上通過流分類,然後在另一臺機器上分析它。所以如果我可以避免未來的偏頭痛,因爲像hash這樣的小東西不會在不同的操作系統中返回相同的值,我會:) –

+0

啊!我明白你在說什麼。你可以嘗試一下,但根據我的經驗,這種通用解決方案經常存在。上面提到的lib可能在x,y OS中運行,但可能在z OS中運行。然後怎樣呢?它更好地設計你的系統,因爲'hash'似乎是你的應用程序的核心,所以我們可以從容忍的地方開始。想想看... –

2

以下Python哈希函數,由恩·切斯萊克·波斯塔瓦,應保持翻過幾個OS和CPU一致: https://pypi.python.org/pypi/pyhashxx/

+0

我應該比'hashlib'更喜歡它嗎? –

+0

如果您擔心hashlib不是獨立於操作系統的,並且您的應用程序需要可移植,那麼是的。 – Cyan