AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 496788
Accepted
flow2k
flow2k
Asked: 2019-01-26 16:58:57 +0800 CST2019-01-26 16:58:57 +0800 CST 2019-01-26 16:58:57 +0800 CST

O tamanho do arquivo random_source importa?

  • 772

Alguns utilitários GNU coreutils gostam sorte shufusam um arquivo como o que efetivamente serve uma semente. O tamanho do arquivo importa?

A maneira recomendada, https://www.gnu.org/software/coreutils/manual/html_node/Random-sources.html , usa um método baseado em openssl que leva bastante tempo.

E se eu usar apenas uma palavra de 6 letras como abaixo? Isso afeta a capacidade dos referidos utilitários de criar pseudo-aleatoriedade?

shuf -i1-10 --random-source=<(echo durian)

sort coreutils
  • 2 2 respostas
  • 1039 Views

2 respostas

  • Voted
  1. Best Answer
    Sparhawk
    2019-01-26T17:26:30+08:002019-01-26T17:26:30+08:00

    Se você fornecer uma string fixa como fonte aleatória, ela será "randomizada" da mesma maneira todas as vezes . Para provar isso, vamos testá-lo.

    $ printf '%s\n' a b c | shuf --random-source=<(echo durian)
    b
    c
    a
    

    No meu sistema, a saída é a mesma toda vez que executo o comando acima. (Suspeito que possa ser diferente dependendo da implementação, mas ainda deve ser o mesmo todas as vezes.) Você está codificando a aleatoriedade, conforme este XKCD:

    XKCD

    Não é realmente aleatório; está apenas produzindo a mesma saída todas as vezes. O tamanho da fonte de string fixa é irrelevante. Ainda está fixo.

    Há informações relevantes no link que você fornece relacionadas à qualidade aleatória da fonte aleatória:

    /dev/urandomé suficiente para a maioria dos usos práticos, mas os aplicativos que exigem proteção de dados privados de alto valor ou longo prazo podem exigir uma fonte de dados alternativa como /dev/randomou /dev/arandom.

    As duas últimas opções são "mais aleatórias" que a primeira. A implicação é que quanto mais aleatória a fonte, mais aleatório o embaralhamento. Portanto, strings fixas não são particularmente robustas.

    Com shufespecificamente, o comprimento da string fixa é relevante. Por exemplo, o seguinte falha.

    shuf -i1-19 --random-source=<(echo durian)
    

    No entanto, se você restringir a saída para -n16, ela funcionará, mas -n17falhará. Testei algumas palavras e permutações diferentes e, à medida que reduzo o número de caracteres na fonte, o máximo -ndiminui.

    source length     max -n
    7                 16
    6                 13
    5                 10
    4                  8
    3                  5
    2                  3
    1                  1
    0                  0
    

    Não tenho certeza do relacionamento direto, mas presumivelmente itens classificados adicionais (em -n) exigem mais caracteres de origem como sementes. No entanto, shufpelo menos, uma vez que você ultrapasse esse limite mínimo, cada caractere adicional não faz diferença para a aleatoriedade em si. No exemplo acima, se você alterar o 50º caractere, a saída ainda será a mesma.

    • 3
  2. Joachim Wagner
    2020-12-06T04:36:35+08:002020-12-06T04:36:35+08:00

    Sim, o tamanho importa para shuf: O tamanho deve ser tão grande quanto necessário para randint_genmax()em https://github.com/coreutils/coreutils/blob/master/gl/lib/randint.c para derivar todos os números aleatórios do algoritmo de embaralhamento usado necessidades (cada número pode ser escolhido de um intervalo específico). Este tamanho depende de ambos

    • o número de linhas de entrada e
    • os valores de byte no arquivo de origem aleatório.

    Se você alterar um byte no arquivo de origem aleatório, ele poderá alterar quantos bytes no total são necessários. Por exemplo, se for necessário um número no intervalo 0-254, basta ler um byte se estiver nesse intervalo, mas se o byte for '\xff' (255 como um inteiro de 8 bits sem sinal) pelo menos um mais byte é necessário também.

    Isso pode ser usado para construir um exemplo que falha mesmo que muitos bytes sejam fornecidos:

    shuf -i1-10 --random-source=<(echo $'\xff\xff\xff\xff\xff\xff\xff\xff')
    shuf: ‘/dev/fd/63’: end of file
    

    Apenas três bytes 'ab' + nova linha podem ser suficientes:

    shuf -i1-10 --random-source=<(echo ab) | md5sum
    742a739ea959851f883ec692d6675cdf  -
    

    Para fornecer uma fonte pseudo aleatória com semente, não encontrei uma solução apenas de linha de comando, mas pelo menos aqui está uma solução de rascunho usando apenas o bash (veja o problema conhecido abaixo):

    (1) Script auxiliar seed-and-counter.sh:

    #!/bin/bash
    SEED="$1"
    COUNTER=0
    while true; do
        echo $SEED $COUNTER
        COUNTER=$((COUNTER+1))
    done
    

    (2) Roteiro auxiliar bin-hash-lines.sh:

    #!/bin/bash
    echo "$1" | md5sum | cut -c-32 | xxd -r -p
    

    (3) Combine-os para produzir uma sequência reproduzível de bytes aleatórios:

    ./seed-and-counter.sh 320 | xargs -d'\n' -n 1 ./bin-hash-lines.sh | hexdump -C | head
    00000000  02 56 8b 68 34 78 bd 98  6e 8d 42 d2 cb 7b 8d b4  |.V.h4x..n.B..{..|
    00000010  7d d8 23 b9 89 f8 29 5b  6c 51 fb 9f b3 74 1d 03  |}.#...)[lQ...t..|
    00000020  bc 1d 62 81 31 0b 5d 82  8c cb 37 4a b8 bc 85 70  |..b.1.]...7J...p|
    00000030  88 3d 57 ae ef 77 28 aa  3a cf f7 49 ed 00 37 21  |.=W..w(.:..I..7!|
    00000040  45 55 39 94 3f 30 90 49  4f f0 04 d5 1e c5 0c 1e  |EU9.?0.IO.......|
    00000050  e4 e8 8e 72 84 58 3c 03  66 e5 bd af fb 87 78 6b  |...r.X<.f.....xk|
    00000060  b0 40 e4 cb 6f 78 c0 90  f8 e6 0d 73 89 fe 0a 98  |[email protected]....|
    00000070  04 45 39 0c e6 32 ae 26  c5 13 0e ca fb e6 bc f2  |.E9..2.&........|
    00000080  49 57 65 da 79 c1 4f 03  f7 97 ec 8c 72 59 cf ac  |IWe.y.O.....rY..|
    00000090  64 d6 fe 87 6e 18 5e 81  2c 9b a3 6a b5 10 12 da  |d...n.^.,..j....|
    

    (4) Use isso como fonte aleatória:

    shuf -i1-1000 --random-source=<(./seed-and-counter.sh 320 | xargs -d'\n' -n 1 ./bin-hash-lines.sh) | tail
    430
    854
    890
    580
    441
    960
    944
    332
    687
    703
    

    Problema conhecido: os scripts auxiliares e o xargscomando parecem continuar em execução.

    • 1

relate perguntas

  • Usando um único comando de linha de comando, como eu pesquisaria cada arquivo de texto em um banco de dados para encontrar as 10 palavras mais usadas?

  • A classificação numérica falha ao classificar corretamente o arquivo

  • Como classificar o número de linhas por data em um arquivo?

  • Listar arquivos classificados de acordo com a linha de conteúdo específica

  • Leia o arquivo de texto com palavras e sua contagem de ocorrências e saída de impressão classificada

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve