이 명령은 숫자를 생성 /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보다 큰 데이터 세트에 대해 동일한 결과를 인쇄합니다.
출력에서 임의의 숫자(예: 045765)를 찾으면 매번 다른 숫자가 35~47번 표시됩니다.
나는 숫자를 계산하기 위해 작은 Python 스크립트를 작성했습니다. 단 하나만 고유하지 않았지만 더미의 마지막 숫자였습니다. 아마도 EOF 때문일 것입니다. 데이터 덤프를 인쇄할 때 항상 나머지 숫자보다 길고 맞지 않으므로 무시할 수 있습니다. 65536개 이상의 고유번호가 있음을 증명하기 위해 2621441줄을 사용하여 고유한 숫자가 없음을 증명합니다.
어떻게 이런 일이 발생했는지 이해할 수 없습니다. 명령의 일부 구성 요소에 버그가 있는 것 같습니다.
어떻게 이런 일이 일어나는지 설명할 수 있는 사람이 있나요?
답변1
한 단어: 8진수.
인쇄되는 것은 숫자가 있는 곳 부터 od
입니다 . 이러한 문자열은 서로 다른 방식으로 인코딩된 2바이트 값일 뿐입니다. 다른 인코딩은 65536개의 가능성이 있다는 사실을 바꾸지 않습니다. 충분히 큰 무작위 데이터 세트에서 이 모든 것을 얻을 수 있습니다.000000
177777
0..7
"숫자로" 계산하더라도 모든 것이 맞습니다. 8진수를 올바르게 사용하면 됩니다. 당신의 시도:
가능한 숫자의 수: 100000(00000-99999이기 때문에)
소수점으로 가정됩니다. 올바른 방법은 다음과 같습니다.
- 첫 번째 문자는
0
또는1
, (2가지 가능성)입니다. - 그런 다음 5개의 문자가 있습니다
0..7
(각 문자에 대해 8개의 가능성).
2×8 5 = 2 16