Linux

為什麼在每個系統上計算 /dev/urandom 中的重複數字都相同?

  • April 8, 2021

此命令生成數字/dev/urandom並列印有多少重複數字,在每個系統上都返回相同的值。為什麼?

dd if=/dev/urandom count=1 bs=5M 2> /dev/null | od - | cut -d " " -f 2- | sed s/" "/"\n"/g | sort -n | uniq -d | wc -l

這是命令,在我執行它的每個系統上,它返回 256^2、16 位上限、UNIX 系統上的埠數量,或者只是 65536,包括在不同的體系結構上。

奇怪的是,每個數字都是 6 位數字,即使是 5M 的數據轉儲也比可能的數字量要大得多〜該數字不太可能不重複。

可能數字的數量:100000(因為 00000-99999)

數據轉儲中的行(5M):2621441

它與 ca 1M 以上的任何數據集列印相同。

如果我在輸出中用 grep 查找隨機數,比如說 045765,它會彈出 35-47 次,每次的數量不同。

我寫了一個小python腳本來計算數字,只有一個不是唯一的,但那是啞巴中的最後一個數字,可能是因為EOF。列印數據轉儲時,它總是比其他數字長,而且不合適,所以我們可以忽略它。它證明了沒有數字是唯一的,它用 2621441 行證明有超過 65536 個唯一數字。

我無法理解,這怎麼會發生……該命令中的某些組件必須有一個錯誤。

有沒有人解釋這怎麼會發生?

一個字:八進制。

od列印的是 from到000000177777數字是0..7。這些字元串只是以不同方式編碼的兩字節值。不同的編碼不會改變有 65536 種可能性的事實。從足夠大的隨機數據集中,您可以獲得所有數據。

即使你“按數字”計算,一切都會合適;你只需要正確地使用八進制。您的嘗試:

可能數字的數量:100000(因為 00000-99999)

假定十進制。正確的方法是這樣的:

  • 第一個字元是01,(2 種可能性)。
  • 然後有 5 個字元0..7,(每個字元有 8 種可能性)。

2 x 8 5 = 2 16

引用自:https://unix.stackexchange.com/questions/644056