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 / 526611
Accepted
Andriy Makukha
Andriy Makukha
Asked: 2019-06-25 05:05:46 +0800 CST2019-06-25 05:05:46 +0800 CST 2019-06-25 05:05:46 +0800 CST

Qual algoritmo de soma de verificação é usado pela versão 5 do Unix?

  • 772

Não consigo descobrir qual algoritmo foi usado no Unix V5 e V6 para o sumcomando.

A princípio, pensei que fosse uma simples soma de bytes módulo 2^16. No entanto, para uma string "1111111111\n" repetida 320 vezes, ela calcula uma soma de verificação de 28930 (usando o emulador PDP-11 de Julius Schmidt para JavaScript). Considerando que uma simples soma de bytes para ele é dois bytes menor:

$ python -c 'print(sum(bytearray(b"1111111111\n"*320)) & 0xFFFF)'
28928

Mais tarde, nas páginas man do MacOS , descobri que os comandos sume cksumtinham um longo histórico de inconsistências. No entanto, mesmo as versões "históricas" do algoritmo fornecidas no MacOS não concordam com a soma de verificação do Unix V5. A correspondência mais próxima é o comando padrão sumdo UNIX System V (invocado no Mac como cksum -o 2), que retorna a mesma soma de verificação para esta string, mas discorda para outras:

$ python -c 'print("1111111111\n"*320, end="")' | cksum -o 2
28930 7

Para ser mais específico, o cksum -o 2e o Unix V5 sumproduzem saídas diferentes para a maioria dos arquivos binários no emulador (por exemplo, na pasta /bin), embora concordem na maioria dos arquivos de texto.

Este é um comportamento genuíno ou um bug no emulador? Se for genuíno, qual é o algoritmo?

PS Aqui está o código fonte , se alguém puder ler o código assembly de 1974.

historical-unix checksum
  • 1 1 respostas
  • 417 Views

1 respostas

  • Voted
  1. Best Answer
    palupicu
    2019-06-25T09:06:17+08:002019-06-25T09:06:17+08:00

    A princípio, pensei que fosse uma simples soma de bytes módulo 2^16

    É uma soma mod 2^16, só que cada vez que estourar, um 1 será adicionado a ela. Além disso, os bytes serão estendidos antes de serem adicionados à soma. Aqui está um trecho "comentado" da montagem:

    # r2 is the pointer into the data
    # r0 is the length of the data
    # r5 is the sum
    2:
            movb    (r2)+,r4    # r4 = sign_extend(*r2++)
            add     r4,r5       # r5 += r4
            adc     r5          # if(r5 overflowed) r5++
            sob     r0,2b       # if(--r0) goto 2 above
    

    o mesmo colocado em um pequeno programa C (use como ./v5sum < file):

    #include <stdio.h>
    int main(void){
            int c, s = 0;
            while((c = getchar()) != EOF){
                    s += c & 0x80 ? c | 0xff00 : c; // alternative: s += (unsigned short)(signed char)c
                    if(s & 0x10000){ s++; s &= 0xffff; };
            }
            printf("%d\n", s);
            return 0;
    }
    

    Para ser mais específico, o cksum -o 2 e a soma do Unix V5 produzem saídas diferentes para a maioria dos arquivos binários no emulador (por exemplo, na pasta /bin), embora eles concordem na maioria dos arquivos de texto.

    Isso porque o unix original v5sum assinará estender os caracteres e apenas os binários contêm bytes >= 0x80. Caso contrário, os algoritmos devem ser semelhantes e diferir apenas com arquivos muito grandes (onde a soma dos caracteres transbordará um int não assinado de 32 bits).

    • 4

relate perguntas

  • Use pv com find -exec

  • O que aconteceu com elfsign e elfverify?

  • Por que o crc32 diz que alguns dos meus arquivos são 'RUIM'?

  • Onde posso obter o Unix original? [duplicado]

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