2011-10-24 50 views
3

我用這個函數散列我的密碼:在MySQL表64位密碼哈希

// RETURNS: rAyZOnlNBxO2WA53z2rAtFlhdS+M7kec9hskSCpeL6j+WwcuUvfFbpFJUtHvv7ji 
base64_encode(hash_hmac('sha384', $str . SC_NONCE, SC_SITEKEY, true)); 

我哈希存儲在CHAR(64)場(MySQL的-InnoDB)。

我應該用varchar(64)而不是char(64)?爲什麼?

編輯: 我改變SHA256SHA384。因爲在這個例子中,sha256總是爲我返回44個字節。抱歉讓人困惑。現在它是64個字節。

+1

確實是這樣的情況,基地64編碼的字符串返回長度爲64位的散列?我不認爲它... –

+0

@BrendanBullen - 我更新了問題。對不起,令人困惑的例子:( – dino

回答

4

varchars通過僅使用最多所需長度來節省存儲空間。如果64位散列總是64,那麼在存儲方面沒有什麼區別,所以在這種情況下char可能和varchar一樣好。

如果要存儲可變長度的數據,那麼varchar將節省浪費不必要的空間。

+2

嗯,你實際上使用1字節的開銷與varchar相比字符,多少差異,使得是另一回事:) – Marcus

5

你應該使用CHAR(64),因爲你的散列長度是固定的。使用VARCHAR會添加另一個字節,浪費空間。

+0

它絕對是一個固定的長度? –

2

即使您使用Base 64編碼字符串,結果也不一定是64位長。在這種情況下,VARCHAR更好,因爲結果可能比64位短。

實際上如所見,here,64位是最大長度而不是設定長度。

+0

我更新了問題布蘭登。 – dino

3

你可以做到這一點的另一種方法(如果你真的很關心空間)是以二進制形式存儲散列。如何做到這一點的細節可以發現here;你可能需要BINARY(32)來獲得SHA-256哈希值。