2014-08-29 20 views
11

Mi chiedo se la somma CRC32 e CRC32C in particolare tornino mai a 0? La risposta semplice sarebbe "sì" dato un set di dati abbastanza grande. Tuttavia, mi chiedevo se ci fosse qualche provisioning nello standard CRC32C che impedisse esplicitamente che ciò accadesse.È possibile che CRC32 (C) ritorni mai a 0?

Il caso di utilizzo di questo è che ho bisogno di essere in grado di verificare se il file remoto è vuoto e tutto ciò che è la somma di controllo CRC32C. Quindi, in altre parole, posso dedurre che se CRC32C è 0 allora il file è garantito essere vuoto.

Se possibile, si prega di fornire qualsiasi riferimento ad una norma, ove definita.

+1

Potete utilizzare il proprio checksum? In tal caso, definire zero da utilizzare solo per il file vuoto. Se la funzione hash produce zero, è sufficiente impostarla su 1. – usr

+0

Si conosce il valore CRC32 ma non la lunghezza del file? Eh? – kay

+0

@usr L'algoritmo CRC32C è altamente ottimizzato per la velocità ed è implementato nell'hardware delle CPU Intel. Ho bisogno di questo per i calcoli a velocità di filo, quindi l'implementazione personalizzata non è un'opzione. – dtoux

risposta

12

A zero è probabile come qualsiasi altro valore di una checksum CRC32. Un CRC è essenzialmente il resto della divisione dell'intero input (preso come un grande numero binario) per un valore preselezionato. Se l'input sembra essere divisibile per quel valore, il resto, e quindi il CRC, è zero.

+0

Quella è la mia comprensione attuale, ma sto ancora sperando che qualcuno si rivelerà fraintendetemi :-) – dtoux

17

@Yanek è quasi del tutto corretta.

Solo per divertimento, qui è una sequenza di cinque caratteri che dà un CRC-32C zero: DYB|O. Ecco una sequenza di quattro byte in esadecimale che dà zero: ab 9b e0 9b. In effetti, questa è l'unica sequenza di quattro byte che può farlo. Non ci sono sequenze a tre byte o più brevi che ti daranno zero. È qui che @Yanek non ha esattamente ragione, in quanto per le sequenze a tre byte o più brevi, zero non è altrettanto probabile. La probabilità di ottenere uno zero è zero in questi casi.

+0

Per 3 ingressi byte, ci sono circa 256 le uscite che hanno probabilità zero. Non c'è nulla di speciale nello zero output per quanto posso dire. – usr

+2

Ci deve essere un _lot_ più di quello. Ci sono solo 2^24 possibili input a 3 byte, quindi ci devono essere 2^32-2^24 == 4,278,190,080 uscite con probabilità zero. Il resto ha probabilità 2^-24. –

+0

Giusto, ho diviso per errore i numeri invece di sottrarre. – usr

0

ne dite di questo, non un CRC a 32 bit, però:

1011 | 110011001010.000 
     1011 
     ---- 
     1111 
     1011 
     ---- 
     1001 
     1011 
     ---- 
      1000 
      1011 
      ---- 
      1110 
      1011 
      ---- 
       1011 
       1011 
       ---- 
        0000 (...) 
        1011 
        ---- 
        1011 
        1011 
        ---- 
        0000 

Oppure:

1100 | 11001010.000 
     1100 
     ---- 
      1010 
      1100 
      ---- 
      1100 
      1100 
      ---- 
      (...) 0 
Problemi correlati