2016-05-21 3 views
-2

мы использовали, чтобы узнать GetHashCode в .NET работает следующим образом:Как отменить GetHashCode

public int GetStringHashCode(string value) 
    { 
     int hash1 = (5381 << 16) + 5381; 
     int hash2 = hash1; 

     int len = value.Length; 
     int intval; 
     int c0, c1; 
     int i = 0; 
     while (len > 0) 
     { 
      c0 = (int)value[i]; 
      c1 = (int)value[i + 1]; 
      intval = c0 | (c1 << 16); 
      hash1 = ((hash1 << 5) + hash1 + (hash1 >> 27))^intval; 
      if (len <= 2) 
      { 
       break; 
      } 
      i += 2; 
      c0 = (int)value[i]; 
      c1 = len > 3 ? (int)value[i + 1] : 0; 
      intval = c0 | (c1 << 16); 
      hash2 = ((hash2 << 5) + hash2 + (hash2 >> 27))^intval; 
      len -= 4; 
      i += 2; 
     } 

     return hash1 + (hash2 * 1566083941); 
    } 

Теперь, как я могу обратить вспять этот метод? (я имею в виду, что как получить значение int и вернуть значение строки (оригинальная строка))

+0

Факт int is 4 байта, в то время как строка может иметь любую длину, уже должна дать вам ключ к тому, что вы не можете восстановить строку обратно из int ... – Evk

ответ

4

Нет никакого реального способа сделать это, вы можете попробовать работать в обратном направлении, но это даст вам непонятный беспорядок, вы не получите «исходную строку».

Вы теряете информацию во время процесса хеширования, и нет способа вернуть эту информацию из результата.

+1

Прежде чем вы меняете вниз, .NET. GetHashCode() 'не является криптографический хеш, вы можете отменить вычисление, потому что оно не полагается на вещи, которые нелегко вычислить в обратном порядке (например, найти простые множители). Вам нужно будет сделать «догадки» о потерянной информации, но нет ничего, что было бы «медленным». –

1

Вы можете использовать Rainbow table для хранения исходных строк и быстрого их извлечения в зависимости от хеша.

Смежные вопросы