2016-08-16 3 views
-2

Я ищу что-то, что действует как алгоритм Хеширования, за исключением того, что я хочу, чтобы он генерировал массив предопределенной длины, заданный любой произвольной строкой. В качестве примера:Создание воспроизводимого «тарабарщины» из заданной строки

Произвольное Seed: "энтропии"

Желаемая длина: 100 Воспроизводимые символов из семени.

Возможные Выход: EfvrlL9uGKolblPScba2ziPPON5QEm2Q0fsEPMURqu2NSVSXwaqkgCbjm0naeuoaATGWApJ1afBT3HxaWnoNuXCKSBY7EwCpTOga

Сгенерированный делает не в любом случае должны быть криптографически безопасный и символы генерируются не имеют значения (они могут быть чем угодно, даже непечатные символы). Мое единственное требование состоит в том, чтобы выход был полностью воспроизводимым с учетом того же самого семени. Есть ли у кого-нибудь какие-либо предложения о том, как я могу это сделать?

+0

ли это быть обратимым? Вы хотите, чтобы вернуть исходную строку? –

+0

@PaulHicks Nope. – Krythic

+1

'myString.GetHashCode(). ToString(). PadRight (100, '?')' –

ответ

0

Я решил пойти со своим собственным псевдо-хешем, который работает очень хорошо. Вот код, который я придумал; надеюсь, что это может помочь кому-то еще в будущем:

 public static byte[] HashString(string seed, int length) 
     { 
      char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz".ToCharArray(); 
      byte[] hash = new byte[length]; 
      byte lastHash = 0; 
      for (int i = 0; i < length; i++) 
      { 
       hash[i] = (byte)alphabet[(seed[(i % seed.Length)]^(i + lastHash)) % alphabet.Length]; 
       lastHash = hash[i]; 
      } 
      return hash; 
     } 
+1

Кажется, вам даже не нужно 'seedIndex', так как он всегда соответствует' i'. – zerkms

+0

@zerkms Nevermind, вы правы. Хороший улов. – Krythic

-1

Это способ, которым Вы можете сделать это, не создавая свой собственный хэш:

var myString = "Entropy"; 
byte[] saltBytes = Encoding.ASCII.GetBytes("someSaltIWant"); 
var dBytes = new System.Security.Cryptography.Rfc2898DeriveBytes(myString, saltBytes).GetBytes(75); 
var gibString = Convert.ToBase64String(dBytes); 
Console.WriteLine(gibString); 
// Always prints MVqAYJbmkxgQ4FdTD+a7/BlfZZLBVDXpsAAYtMuJ4aU5iejD+sB3tHqgSRoCg2KD1vnpI5eXhZa6vWvpOuM8dH8aOi1/zKMXuu4a 

Даже если вы не заинтересованы в безопасности, я думаю, с этим хэшированием вы можете легко достичь желаемых 100 символов. С MD5 или любым SHA вы будете короткими.

Если вы предпочитаете непечатаемую строку, вы можете сделать это вместо того, чтобы:

var dBytes = new System.Security.Cryptography.Rfc2898DeriveBytes(myString, strBytes).GetBytes(100); 
string ugly = Encoding.ASCII.GetString(dBytes); 
+0

Интересно, почему это получило вниз ... – Andrew

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

  • Нет связанных вопросов^_^