Стирающий код (англ. erasure code) — в теории кодирования помехоустойчивый код, способный восстановить целые пакеты данных в случае их потери. Такой код позволяет бороться с утечками данных при передаче по каналам связи или работе с памятью. Обычно он используется, когда точная позиция потерянных данных известна априори.
 Стирающий код преобразует сообщение из 
  
    
      
        k
      
    
    {\displaystyle k}
  
 символов в более длинное сообщение (кодовое слово) из 
  
    
      
        n
      
    
    {\displaystyle n}
  
 символов так, что исходное сообщение может быть восстановлено по 
  
    
      
        
          k
          ′
        
      
    
    {\displaystyle k'}
  
 любым символам. Такой код называется 
  
    
      
        (
        n
        ,
        k
        )
      
    
    {\displaystyle (n,k)}
  
 кодом, выражение 
  
    
      
        r
        =
        k
        
          /
        
        n
      
    
    {\displaystyle r=k/n}
  
 — кодовой долей, выражение 
  
    
      
        
          k
          ′
        
        
          /
        
        k
      
    
    {\displaystyle k'/k}
  
 — эффективностью приёма.
 Стирающий код обычно используется на верхних уровнях стека протоколов каналов передачи и хранения информации.
 Оптимальный стирающий отличается тем, что любых 
  
    
      
        k
      
    
    {\displaystyle k}
  
 из 
  
    
      
        n
      
    
    {\displaystyle n}
  
 символов кодового слова достаточно для восстановления исходного сообщения, то есть они имеют оптимальную эффективность приёма.
 Рассмотрим случай, когда 
  
    
      
        n
        =
        k
        +
        1
      
    
    {\displaystyle n=k+1}
  
. С помощью набора из 
  
    
      
        k
      
    
    {\displaystyle k}
  
 значений 
  
    
      
        {
        
          v
          
            i
          
        
        
          }
          
            1
            ≤
            i
            ≤
            k
          
        
      
    
    {\displaystyle \{v_{i}\}_{1\leq i\leq k}}
  
 вычисляется контрольная сумма и добавляется к 
  
    
      
        k
      
    
    {\displaystyle k}
  
 исходным значениям:
 Теперь в набор 
  
    
      
        {
        
          v
          
            i
          
        
        
          }
          
            1
            ≤
            i
            ≤
            k
            +
            1
          
        
      
    
    {\displaystyle \{v_{i}\}_{1\leq i\leq k+1}}
  
 из 
  
    
      
        k
        +
        1
      
    
    {\displaystyle k+1}
  
 значений включена контрольную сумму. В случае потери одного из значений 
  
    
      
        
          v
          
            e
          
        
      
    
    {\displaystyle v_{e}}
  
, его можно будет с лёгкостью восстановить с помощью суммирования оставшихся:
 Более сложные комбинации искомых и получаемых значений представляют собой Граф Таннера.
 Важным подклассом стирающего кода является линейный код. Его название связано с тем, что он может быть проанализирован с помощью линейной алгебры. Пусть 
  
    
      
        x
        =
        
          x
          
            0
          
        
        …
        
          x
          
            k
            −
            1
          
        
      
    
    {\displaystyle x=x_{0}\dots x_{k-1}}
  
 — исходные данные, 
  
    
      
        G
      
    
    {\displaystyle G}
  
 — матрица размера 
  
    
      
        n
        ×
        k
      
    
    {\displaystyle n\times k}
  
, тогда закодированные данные 
  
    
      
        (
        n
        ,
        k
        )
      
    
    {\displaystyle (n,k)}
  
- кода могут быть представлены как 
  
    
      
        
          
            
              y
              →
            
          
        
        =
        G
        
          
            
              x
              →
            
          
        
      
    
    {\displaystyle {\vec {y}}=G{\vec {x}}}
  
. Предположим, что приёмник получил 
  
    
      
        k
      
    
    {\displaystyle k}
  
 компонент вектора 
  
    
      
        
          
            
              y
              →
            
          
        
      
    
    {\displaystyle {\vec {y}}}
  
, тогда исходные данные могут быть восстановлены с помощью 
  
    
      
        k
      
    
    {\displaystyle k}
  
 уравнений, связанных с известными компонентами вектора 
  
    
      
        
          
            
              y
              →
            
          
        
      
    
    {\displaystyle {\vec {y}}}
  
. Пусть матрица 
  
    
      
        
          G
          ′
        
      
    
    {\displaystyle G'}
  
 размера 
  
    
      
        k
        ×
        k
      
    
    {\displaystyle k\times k}
  
 соответствует этой системе уравнений. Восстановление возможно, если все эти уравнения линейно независимые и, в общем случае, это означает, что любая матрица размера 
  
    
      
        k
        ×
        k
      
    
    {\displaystyle k\times k}
  
 обратима. Матрица 
  
    
      
        G
      
    
    {\displaystyle G}
  
 называется генерирующей матрицей кода, так как любой допустимый 
  
    
      
        
          
            
              y
              →
            
          
        
      
    
    {\displaystyle {\vec {y}}}
  
 может быть получен как линейная комбинация столбцов матрицы 
  
    
      
        G
      
    
    {\displaystyle G}
  
. Так как её ранг равен 
  
    
      
        k
      
    
    {\displaystyle k}
  
, то любое подмножество из 
  
    
      
        k
      
    
    {\displaystyle k}
  
 закодированных элементов должно содержать информацию о всех 
  
    
      
        k
      
    
    {\displaystyle k}
  
 исходных данных. Для получения исходных данных необходимо решить линейную систему: 
  
    
      
        
          
            
              
                y
                ′
              
              →
            
          
        
        =
        
          G
          ′
        
        
          
            
              x
              →
            
          
        
      
    
    {\displaystyle {\vec {y'}}=G'{\vec {x}}}
  
, где 
  
    
      
        
          
            
              
                y
                ′
              
              →
            
          
        
      
    
    {\displaystyle {\vec {y'}}}
  
 — подмножество из 
  
    
      
        k
      
    
    {\displaystyle k}
  
 элементов вектора 
  
    
      
        
          
            
              y
              →
            
          
        
      
    
    {\displaystyle {\vec {y}}}
  
, доступных на приёмнике.
 В случае, когда 
  
    
      
        k
        =
        2
      
    
    {\displaystyle k=2}
  
, избыточные символы могут быть созданы как промежуточные точки на отрезке, соединяющем два исходных символа. Это показано на простом примере, называемом неисправной электронной почтой:
 Алиса хочет отправить свой телефонный номер (555629) Бобу, используя неисправную электронную почту. Данный вид почты работает так же, как обычная электронная почта, за следующим исключением:
 Вместо того, чтобы спросить у Боба подтверждения сообщения, которое она отправила, Алиса придумывает следующую схему:
 Боб знает, что выражение для 
  
    
      
        f
        (
        k
        )
      
    
    {\displaystyle f(k)}
  
 следующее 
  
    
      
        f
        (
        i
        )
        =
        a
        +
        (
        b
        −
        a
        )
        (
        i
        −
        1
        )
      
    
    {\displaystyle f(i)=a+(b-a)(i-1)}
  
, где 
  
    
      
        a
      
    
    {\displaystyle a}
  
 и 
  
    
      
        b
      
    
    {\displaystyle b}
  
 — две части телефонного номера. Теперь предположим, что Боб получает «D=777» и «E=851».
 Боб может восстановить телефонный номер Алисы с помощью 
  
    
      
        a
      
    
    {\displaystyle a}
  
 и 
  
    
      
        b
      
    
    {\displaystyle b}
  
, используя значения 
  
    
      
        f
        (
        4
        )
      
    
    {\displaystyle f(4)}
  
 и 
  
    
      
        f
        (
        5
        )
      
    
    {\displaystyle f(5)}
  
, которые он получил. Более того, он может это сделать, используя два любых полученных сообщения. Значит, в этом примере кодовая доля равна 40 %. Заметим, что Алиса не может закодировать свой номер телефона только в одном сообщении такой почты, так как он состоит из 6 символов, а максимальная длина одного сообщения — 5 символов. Если бы она отправляла свой номер телефона по частям, запрашивая подтверждения каждой части от Боба, то было бы отправлено минимум 4 сообщения (два от Алисы и два подтверждения от Боба).
 Приведённая выше линейная конструкция может быть обобщена до полиномиальной интерполяции. В таком случае точки теперь вычисляются над конечным полем 
  
    
      
        
          
            F
          
          
            
              2
              
                m
              
            
          
        
      
    
    {\displaystyle \mathbb {F} _{2^{m}}}
  
, где 
  
    
      
        m
      
    
    {\displaystyle m}
  
 — число бит в символе. Отправитель нумерует символы данных от 
  
    
      
        0
      
    
    {\displaystyle 0}
  
 до 
  
    
      
        k
        −
        1
      
    
    {\displaystyle k-1}
  
 и посылает их. Затем он строит, например, интерполяционный многочлен Лагранжа 
  
    
      
        p
        (
        x
        )
      
    
    {\displaystyle p(x)}
  
 степени 
  
    
      
        k
      
    
    {\displaystyle k}
  
, так что 
  
    
      
        p
        (
        i
        )
      
    
    {\displaystyle p(i)}
  
 равен 
  
    
      
        i
      
    
    {\displaystyle i}
  
-ому символу данных. Потом он отправляет 
  
    
      
        p
        (
        k
        )
        ,
        …
        ,
        p
        (
        n
        −
        1
        )
      
    
    {\displaystyle p(k),\ldots ,p(n-1)}
  
. С помощью полиномиальной интерполяции получатель сможет восстановить потерянные данные в случае, если он успешно принял 
  
    
      
        k
      
    
    {\displaystyle k}
  
 символов.
 Данный процесс реализован в Коде Рида — Соломона с кодовыми словами, сконструированными над конечным полем при использовании определителя Вандермонда.
 Почти оптимальный стирающий код требует 
  
    
      
        (
        1
        +
        ε
        )
        k
      
    
    {\displaystyle (1+\varepsilon )k}
  
 символов, чтобы восстановить сообщение (где 
  
    
      
        ε
        >
        0
      
    
    {\displaystyle \varepsilon >0}
  
). Величина 
  
    
      
        ε
      
    
    {\displaystyle \varepsilon }
  
 может быть уменьшена за счёт дополнительного времени работы процессора. При использовании таких кодов необходимо решить, что предпочтительнее: сложность вычислений или возможность коррекции сообщений. В 2004 году существовал только один почти оптимальный стирающий код с линейным временем кодирования и декодирования — код Торнадо.
 Стирающие коды применяются в:
 Здесь приведены некоторые примеры различных кодов.