-2

任意の文字列を指定して事前定義された長さの配列を生成することを除いて、ハッシングアルゴリズムのように機能するものを探しています。例として:

任意のシード: 「エントロピー」

希望 の長さ: 100 シードから再現可能な文字。

可能な出力: EfvrlL9uGKolblPScba2ziPPON5QEm2Q0fsEPMURqu2NSVSXwaqkgCbjm0naeuoaATGWApJ1afBT3HxaWnoNuXCKSBY7EwCpTOga

生成された出力は、暗号的に安全である必要はまったくなく、生成された文字は問題ではありません (印刷できない文字であってもかまいません)。私の唯一の要件は、同じシードが与えられた場合に出力が完全に再現可能であることです。これを達成する方法について何か提案はありますか?

4

2 に答える 2

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;
        }
于 2016-08-16T01:54:03.893 に答える
-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);
于 2016-08-16T02:42:55.620 に答える