2012-02-11 17 views

回答

27

種子參數是一種讓您隨機化散列函數的方法。您應該在散列函數的相同應用程序中爲所有對散列函數的調用提供相同的種子值。然而,每次調用你的應用程序(假設它正在創建一個新的哈希表)可以使用不同的種子,例如一個隨機值。

爲什麼提供?

一個原因是攻擊者可能使用散列函數的屬性來構造拒絕服務攻擊。他們可以通過爲散列函數提供字符串來實現這一點,這些字符串都會散列到相同的值,從而破壞散列表的性能。但是,如果您對程序的每次運行使用不同的種子,攻擊者必須使用的字符串集纔會發生變化。

請參見:Effective DoS on web application platform

還有一個Twitter tag for #hashDoS

+4

這是有關,但不完全等同於的想法[通用散列(http://en.wikipedia.org/wiki/Universal_hashing):而不是一個散列函數,你有一個整個家庭(在此情況下,MurmurHash3是家庭,每個可能的種子價值給你在該家庭的特定功能)。如果您發現您的輸入數據恰巧會產生散佈不良的散列(例如,由於攻擊),您可以選擇一個新的隨機種子值並重新散列數據;數據不太可能對您的新種子價值產生不良分佈,因此您擊敗了攻擊。 – 2012-02-11 15:42:16

0

此處代表鹽值爲seed。向其提供隨機但私有的(對你的應用程序)數據,因此散列函數將爲相同的數據提供不同的結果。例如,使用此功能對您的數據進行摘錄,以檢測第三方對原始數據的修改。他們幾乎無法複製有效的散列值,直到他們知道您使用的鹽爲止。

鹽(或種子)也用於防止不同數據的散列衝突。例如,您的數據塊A和B可能會生成相同的散列:h(A)== h(B)。但是,如果提供某種附加數據,則可以避免這種衝突情況。碰撞是非常罕見的,但有時鹽是一種避免具體數據集的方法。

+0

其實這是doubtfull。對於非密碼散列函數,「sault」的目的是什麼? – Lol4t0 2012-02-11 15:33:31

+2

MurmurHash是一個非加密散列函數。對於_secure_消息摘要,這不是一個合適的選擇。 – 2012-02-11 15:34:17

1

在給定的實現seed構建初始化向量使用。它是任意值,爲不同的數據選擇不同的值會降低衝突率。但請注意,那你應該知道一雙seed - data那麼。