-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 回答