Geração de números aleatórios no Solaris?

2

Qual é a melhor maneira de gerar números aleatórios no Solaris?

Eu não consigo encontrar uma boa resposta para isso. A maioria dos resultados não funciona no meu ambiente. Existe uma variável ou comando RAND que parece lógico que funcionaria de alguma maneira semelhante a $ RANDOM, que eu vejo na maioria das minhas pesquisas, mas sempre produz 0.

Eu encontrei este comando

od -X -A n /dev/random | head -2

O que parece ser muito aleatório, mas o formato de retorno é estranho (para mim).

     140774 147722 131645 061031 125411 053337 011722 165106
     066120 073123 040613 143651 040740 056675 061051 015211

Atualmente em uso:

-bash-3.2$ uname -a
SunOS XXXXXXXXX 5.10 Generic_150400-29 sun4v sparc SUNW,SPARC-Enterprise-T5120
    
por JaredTS486 24.11.2015 / 00:12

3 respostas

6

$RANDOM está disponível em ksh e no bash, mas não em /bin/sh . O valor é um número aleatório entre 0 e 32768 e não é adequado para uso criptográfico.

A leitura de /dev/random gera um fluxo de bytes aleatórios adequado para uso criptográfico. Como esses são bytes arbitrários, potencialmente incluindo bytes nulos, você não pode armazená-los em uma variável shell. Você pode armazenar $n bytes em um arquivo com

</dev/random dd ibs=1 count=$n >rnd

Você pode usar od para transformar esses bytes em uma representação imprimível usando valores octais ou hexadecimais. Se você achar a saída “estranha”, bem, talvez você devesse escolher diferentes opções od .

Outra opção para obter uma representação imprimível é chamar uuencode para produzir Base64:

</dev/random dd ibs=1 count=$n | uuencode -m _ | sed -e '1d' -e '$d'
    
por 24.11.2015 / 01:59
1

Existem três maneiras de obter n bytes, expresso como 2*n dígitos hexadecimais:

#!/bin/bash
n=64
# Read n bytes from urandom (in hex).
xxd -l "$n" -p                    /dev/urandom | tr -d " \n" ; echo
od  -vN "$n" -An -tx1             /dev/urandom | tr -d " \n" ; echo
hexdump -vn "$n" -e ' /1 "%02x"'  /dev/urandom ; echo

Leitura do urandom (e por favor, use urandom).

Os dígitos hexadecimais podem ser redirecionados para um arquivo ou armazenados em uma variável:

 a="$(xxd -l "$n" -p /dev/urandom)"

E você pode obter os bytes originais usando o xxd, tão simples quanto:

## Atenção, isso produz valores binários

echo "$a" | xxd -r -p      # If the Hex digits are in a variable.
xxd -r -p "$rndfile"       # If the Hex digits are in a file.

Se xxd não estiver disponível e supondo que os dígitos hexadecimais estejam em $a .
Você poderia usar este código bash:

#!/bin/bash

>"$rndfile"                            # erase the file

for (( i=0; i<${#a}/2; i++ )); do      # do a loop over all byte values.

    # convert 2 hex digits to the byte unsigned value:
    printf '%b' $(printf '\0%o' "0x${a:$i*2:2}") >> "$rndfile"

    b="${b#??}"  # chop out two hexadecimal digits.

done

Ou você pode tentar este código sh compatível (deve ser executado no bash confortavelmente). Sim, deve ser compatível com sh. Relate se você encontrar problemas.

Apenas testado em traço (mas deve ser executado em alguns outros).

#!/bin/sh

i=$((${#a}/2))          # The (length of $a ) / 2 is the number of bytes.
b="$a"                  # use a temporal variable. It will be erased.
: >"$rndfile"           # erase file contents

while [ $i != 0 ]; do

    # Write one byte transformed to binary:
    printf '%b' $(printf '\0%o' "0x${b%"${b#??}"}") >> "$rndfile"

    b="${b#??}"  # chop out two hexadecimal digits.
    i=$((i-1))   # One byte less to finish.

done
    
por 25.11.2015 / 20:40
0
</dev/random \
dd bs="${num_len}" count=1 | LC_ALL=C \
tr -c 0-9 "$(printf '[%d*24]' 9 8 7 6 5 4 3 2 1)[0*]"

que deve funcionar bem para a base 10 e não desperdiça nada, embora a distribuição de dígitos seja ligeiramente favorecida para 0.

com o Solaris v < 11, você desejará usar 'backticks em vez de $(...) para a substituição de comandos.

    
por 24.11.2015 / 02:10