c# - 生成两个具有相同哈希码的不同字符串

标签 c# string hashcode

我想做一些测试,需要一些字符串具有相同的哈希码,但不是相同的字符串。我找不到任何示例,所以我决定编写一个简单的程序来帮我完成。

下面的代码一遍又一遍地生成两个随机字符串,直到它们生成相同的哈希码。

    static Random r = new Random();
    static void Main(string[] args)
    {
        string str1, str2;
        do
        {
            str1 = GenerateString();
            str2 = GenerateString();
        } while (str1.GetHashCode() != str2.GetHashCode() && str1 != str2);

        Console.WriteLine("{0}\n{1}", str1, str2);
    }

    static string GenerateString()
    {
        string s = "";
        while (s.Length < 6)
        {
            s += (char)r.Next(char.MaxValue);
        }
        return s;
    }

这段代码似乎(理论上)有效,但可能需要几个世纪才能完成。所以我想反之亦然,从一个哈希码生成两个字符串。

我知道不可能从哈希码中检索字符串,但是否可以从中生成可能的字符串?

我使用的是 Visual Studio 2015 社区版。版本:14.0.23107.0D14REL。

.NET 框架:4.6.00081。

最佳答案

通过反复比较随机字符串来查找两个字符串几乎要花很长时间。而是生成字符串并通过哈希码将它们存储在字典中。然后逐一查找。很快就找到了匹配项。

MATCH FOUND!! xqzrbn and krumld hash code 80425224

void Main()
{

    var lookup = new Dictionary<int,string>();

    while(true) {
        var s = RandomString();        
        var h = s.GetHashCode();
        string s2;
        if (lookup.TryGetValue(h, out s2) && s2 != s) {
            Console.WriteLine("MATCH FOUND!! {0} and {1} hash code {2}",
                lookup[h],
                s,
                h);
            break;
        }
        lookup[h] = s;

        if (lookup.Count % 1000 == 0) {
            Console.WriteLine(lookup.Count);
        }
    }
}

static Random r = new Random();

// Define other methods and classes here
static string RandomString() {

    var s = ((char)r.Next((int)'a',((int)'z')+1)).ToString() +
            ((char)r.Next((int)'a',((int)'z')+1)).ToString() +
            ((char)r.Next((int)'a',((int)'z')+1)).ToString() +
            ((char)r.Next((int)'a',((int)'z')+1)).ToString() +
            ((char)r.Next((int)'a',((int)'z')+1)).ToString() +
            ((char)r.Next((int)'a',((int)'z')+1)).ToString();

    return s;
}

关于c# - 生成两个具有相同哈希码的不同字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32027271/

相关文章:

hash - 可变 HashMap 键是一种危险的做法吗?

c# - .NET 6 使记录中的属性为必需且非空的最佳方法是什么

pandas - 在 pandas 中按字符串和数字对 MultiIndex 列进行排序

java - 如何删除HTTP consul中的哈希码

java - Java中hashCode()是如何计算的

java - 以速度转义美元符号

c# - Entity Framework DbSet 动态查询

c# - 如何在另一个项目中分离 Entity Framework

c# - 确定 .NET 类型是否是动态的(使用 Reflection.Emit 创建)

Java String 删除所有非数字字符但保留小数分隔符