Entropy

砍掉 SHA-256 熵?

  • January 15, 2020

我有一個 NoSQL 鍵值數據庫。我想向其中插入幾百萬條記錄。

對於密鑰生成,我使用前綴(類似data-one-),然後將 SHA-256 雜湊值連接到儲存的值的唯一值。所以結束鍵可能看起來像

data-one-0000fdb60e164cf0bf07cef647354d26ed17c9492ca4bbf4114878325871fa1d

問題是密鑰有點大,它會對數據庫性能產生影響。我想砍掉一些散列以獲得 64 位字元串(所以,8 個字元)。所以我會把上面的鑰匙砍成

data-one-0000fdb6

但它會為剩餘的密鑰留下足夠的熵嗎?數據庫會變大,顯然我不想要衝突。另一個雜湊是否更適合這種用途,或者修剪 SHA-256 是否可以?

假設散列函式是好的,並且普遍認為 SHA-256 是好的,那麼在 $ k $ 樣本到一定大小的範圍內 $ n $ (例如,通過選擇字元子集獲得)的上限為 $ exp(-k^2/2n). $

給你說 $ k=2^{21}=2,097,152 $ (幾百萬)和 $ n=2^{64} $ 意味著你沒有碰撞的機率大約是

$$ exp(-2^{42}/2^{65})=exp(-2^{-21})\approx 1-1.2\times 10^{-7}. $$

如果你有 8 倍的輸入(超過 1600 萬),這將變成

$$ exp(-2^{48}/2^{65})=exp(-2^{-17})\approx 1-7.6\times 10^{-6} $$

所以碰撞的機率將超過百萬分之一。

引用自:https://crypto.stackexchange.com/questions/27458