该命令生成数字/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
对于任何超过约 1M 的数据集,它都会打印相同的结果。
如果我在输出中 grep 查找一个随机数,比如说 045765,它会弹出 35-47 次,每次都有不同的数量。
我写了一个小的Python脚本来计算数字,只有一个不是唯一的,但那是哑巴中的最后一个数字,可能是因为EOF。打印数据转储时,它总是比其余数字长并且不适合,因此我们可以忽略它。它证明没有数字是唯一的,用 2621441 行证明有超过 65536 个唯一数字。
我无法理解这是怎么发生的......该命令中的某些组件必须有一个错误。
有谁能解释一下这是如何发生的?
答案1
一个词:八进制。
打印的od
是从000000
到177777
,其中数字是0..7
。这些字符串只是以不同方式编码的两个字节值。不同的编码并没有改变有 65536 种可能性的事实。从足够大的随机数据集中,您可以得到所有这些。
即使“按数字”数,一切都合适;你只需要正确地使用八进制即可。你的尝试:
可能的数字数量:100000(因为 00000-99999)
假定为十进制。正确的方法是这样的:
- 第一个字符是
0
或1
, (2 种可能性)。 - 然后有 5 个字符
0..7
,(每个字符有 8 种可能性)。
2×8 5 = 2 16