Haszowanie Pearsona

Haszowanie Pearsona to funkcja haszująca przeznaczona do szybkiego wykonywania na procesorach z rejestrami 8-bitowymi . Biorąc pod uwagę dane wejściowe składające się z dowolnej liczby bajtów, generuje na wyjściu pojedynczy bajt, który jest silnie zależny od każdego bajtu wejścia. Jego implementacja wymaga tylko kilku instrukcji oraz 256-bajtowej tablicy wyszukiwania zawierającej permutację wartości od 0 do 255.

Ta funkcja skrótu to CBC-MAC , która wykorzystuje 8-bitowy szyfr podstawieniowy zaimplementowany za pośrednictwem tabeli podstawieniowej . Szyfr 8-bitowy ma znikome bezpieczeństwo kryptograficzne, więc funkcja haszująca Pearsona nie jest silna kryptograficznie , ale jest przydatna do implementacji tablic mieszających lub jako kod sprawdzający integralność danych , do których celów oferuje następujące korzyści:

  • Jest to niezwykle proste.
  • Działa szybko na procesorach o ograniczonych zasobach.
  • Nie ma prostej klasy wejść, dla których kolizje (identyczne wyjścia) są szczególnie prawdopodobne.
  • Biorąc pod uwagę mały, uprzywilejowany zestaw danych wejściowych (np. słowa zarezerwowane dla kompilatora ), tablicę permutacji można dostosować tak, aby te dane wejściowe dawały różne wartości skrótu, tworząc tak zwaną idealną funkcję skrótu .
  • Dwa łańcuchy wejściowe różniące się dokładnie o jeden znak nigdy się nie kolidują. Np. zastosowanie algorytmu do łańcuchów ABC i AEC nigdy nie da tej samej wartości.

Jedną z jego wad w porównaniu z innymi algorytmami haszującymi przeznaczonymi dla procesorów 8-bitowych jest sugerowana 256-bajtowa tablica wyszukiwania, która może być zbyt duża dla małego mikrokontrolera z rozmiarem pamięci programu rzędu setek bajtów. Obejściem tego problemu jest użycie prostej funkcji permutacji zamiast tabeli przechowywanej w pamięci programu. Jednak użycie zbyt prostej funkcji, takiej jak T[i] = 255-i , częściowo podważa użyteczność funkcji skrótu jako anagramów spowoduje uzyskanie tej samej wartości skrótu; Z drugiej strony użycie zbyt złożonej funkcji wpłynie negatywnie na szybkość. Użycie funkcji zamiast tabeli pozwala również na zwiększenie rozmiaru bloku. Takie funkcje naturalnie muszą być bijekcyjne , podobnie jak ich warianty tablicowe.

Algorytm można opisać za pomocą następującego pseudokodu , który oblicza skrót wiadomości C za pomocą tablicy permutacji T :


     algorytm  mieszania Pearsona  to  h := 0  dla każdego  c  w  pętli  C  h := T[ h  xor  c ]  koniec pętli  return  h 

Zmienna mieszająca ( h ) może być inicjowana w różny sposób, np. do długości danych ( C ) modulo 256; ten konkretny wybór jest używany w poniższym przykładzie implementacji Pythona.

Przykładowe wdrożenia

Python , wyjście 8-bitowe

Parametr 'table' wymaga pseudolosowo przetasowanej listy z zakresu [0..255]. Można to łatwo wygenerować, używając wbudowanej zakresu Pythona i używając random.shuffle do permutacji:

   

  0 


     
    
        
       z  losowego  importu  shuffle  example_table  =  list  (  range  (  ,  256  ))  shuffle  (  example_table  )  def  hash8  (  wiadomość  :  str  ,  tabela  )  ->  int  :  """Pearson hashing."""  hash  =  len  (  wiadomość  )  %  256  dla  i  W  
            
      wiadomość  :  hash  =  table  [  hash  ^  ord  (  i  )]  zwraca  hash 

C# , 8-bitowy

  

       
    
              
        
           0
           

            
         public  class  PearsonHashing  {  public  byte  Hash  (  string  input  )  {  const  byte  []  T  =  {  /* Permutacja 0-255 */  };  skrót  bajtowy  =  ;  bajt  []  bajtów  =  Kodowanie  .  UTF8  .  GetBytes  (  dane wejściowe  );  foreach  (  var  b  w  bajtach  )  { 
                
        

         
    
 hash  =  T  [(  bajt  ) (  hash  ^  b  )];  }  zwróć  skrót  ;  }  } 

Zobacz też

  1. Bibliografia _ _ _ _ _ _ _ _ _ _ _ _ _ _ w dniu 2012-07-04 , pobrane 2013-07-13
  2. Bibliografia Linki zewnętrzne _ _ _ _ _ _ _ _ _ _ 009