我可以將 SHA-256 雜湊視為 64 個公平骰子,數字在 1 到 16 之間嗎?
我的理解是 SHA-256 非常隨機或足夠“隨機”。
我認為這意味著每個角色的行為都會像擲 1 到 16 個骰子一樣。
有了這個假設,我希望您可以將重複字元的機率建模為 $ 16^x $ . 於是一連串 $ \texttt{FFF} $ 或者 $ \texttt{333} $ 將有機會 1 到 $ 16^3 (4096) $ 和一串 $ \texttt{FFFF} $ 機會 1 到 $ 16^4 (65536) $ .
但是在生成大量雜湊(以隨機 UUID 作為種子)來確認我的假設時,這些數字並沒有相加。例如,在一組 100k 雜湊中,我已經有超過 1k 個 4 個字元或更多字元的鏈(而我期望有 1 到 2 個鏈)。
所以在這裡我試圖理解為什麼我的假設首先是錯誤的。
我是從根本上誤解了 SHA-256 雜湊的隨機性還是其他原因?
於是一連串 $ \texttt{FFF} $ 或者 $ \texttt{333} $ 將有機會 1 到 $ 16^3 (4096) $
實際上,三個重複 nybbles 的機會(是 $ \texttt{FFF} $ 或者 $ \texttt{333} $ 或者 $ \texttt{000} $ ) 將是 1 英寸 $ 16^2 (256) $ - 發生這種情況是因為有 $ 16^3 $ 這 3 個 nybbles 的值同樣可能,其中 16 個模式是重複的 - 因此重複的機率是 $ {16 \over 16^3} = {1 \over 16^2} $ . 如果您指定它們必須是 $ \texttt{FFF} $ (所以 $ \texttt{333} $ 不會算),然後你會得到 $ 16^3 $ ; 然而,這不是你在做什麼。
例如,在一組 100k 雜湊中,我已經有超過 1k 的 4 個字元或更多字元的鏈
這是正確的——在 100k 雜湊中,大約有 6,000,000 個地方可能會出現一串 4 個重複的 nybbles;任何一個地方都有機率 $ 16^{-3} = {1 \over 4096} $ 作為重複 - 一個簡單的計算給出了大約 1,400 個重複字元串。
我說簡單,因為這種直接的計算忽略了重疊的字元串——例如,一個包含 5 個重複 nybbles 的字元串將算作一次執行,而不是 2 個 4 的執行。此外,重疊字元串所涉及的機率不是獨立的。雖然這些影響在一定程度上降低了預期總數,但我相信簡單的計算對於粗略估計來說已經足夠了。