当前位置: 首页 > 编程语言 > C#

逆向工程String.GetHashCode分享

时间:2023-04-10 16:24:05 C#

逆向工程String.GetHashCodeString.GetHashCode的行为取决于程序架构。所以它将返回一个x86的值和一个x64的值。我有一个必须在x86上运行的测试应用程序,它必须预测必须在x64上运行的应用程序的哈希码输出。下面是mscorwks中String.GetHashCode实现的反汇编。publicoverrideunsafeintGetHashCode(){fixed(char*text1=((char*)this)){char*chPtr1=text1;intnum1=0x15051505;intnum2=num1;int*numPtr1=(int*)chPtr1;(intnum3=this.Length;num3>0;num3-=4){num1=(((num10x1b))^numPtr1[1];numPtr1+=2;}return(num1+(num2*0x5d588b65));}}任何人都可以将此函数移植到安全实现中吗?哈希码不能跨平台复制,你甚至不能在同一个系统上多次运行同一个程序。你走错了路。如果你不改变方向,你的路会很艰难,有一天它可能会以泪流满面。你想要什么解决真正的问题是什么?是否可以编写我自己的哈希函数,作为扩展方法或包装类中的GetHashCode实现,然后使用它?首先,乔恩是正确的;这是傻瓜的差事。我们过去常常“吃掉自己dogfood框架的内部调试版本每天更改哈希算法,以防止人们构建系统-甚至测试系统-依赖不可靠的实现细节,这些细节被记录为随时可能更改。我的建议是退一步问问自己为什么您要尝试做一些危险的事情,而不是将您的系统模拟记录为不适合模拟的系统。这真的是一个要求吗?其次,StackOverflow是一个技术问答网站,而不是“免费为我工作”的网站。如果您一心想做这种危险的事情,并且您需要可以将不安全代码重写为等效安全代码的人,那么我建议您雇用可以为您做这件事的人。虽然此处给出的所有警告都是有效的,但它们并没有回答问题。不幸的是,在我的情况下,GetHashCode()已用于生产中的持久值,我别无选择,只能使用默认的.NET2.032位x86(小端)算法重新实现。我在没有不安全的情况下重新编码如下,这似乎有效。希望这对某人有帮助。//GetStringHashCode()扩展方法等效于在32位系统上执行的Microsoft.NETFramework2.0//String.GetHashCode()方法。publicstaticintGetStringHashCode(这个字符串值){inthash1=(53810){c0=(int)value[i];c1=(int)值[i+1];间隔=c0|(c1>27))^间隔;如果(len3?(int)value[i+1]:0;intval=c0|(c1>27))^intval;长度-=4;我+=2;}返回hash1+(hash2*1566083941);}以下内容准确地重现了.NET4.7代码(可能更早)上的默认String散列。这是由哈希码给出的:通过完整的JIT优化测试的发布版本,其性能略优于内置.NET代码,并且还经过严格的单元测试以确保与.NET行为完全等效。请注意,x86和x64有不同的版本。您的程序通常应包括两者;相应代码清单下方是一个调用工具,可在运行时选择合适的版本。x86-(.NET在32位模式下运行)staticunsafeintGetHashCode_x86_NET(int*p,intc){inth1,h2=h1=0x15051505;while(c>2){h1=((h1>27))^*p++;h2=((h2>27))^*p++;c-=4;}如果(c>0)h1=((h1>27))^*p++;返回h1+(h2*0x5d588b65);}x64–(.NET在64位模式下运行)staticunsafeintGetHashCode_x64_NET(Char*p){inth1,h2=h1=5381;while(*p!=0){h1=((h1调用任一平台(x86/x64)线束/扩展方法:以上是C#学习教程:逆向工程String.GetHashCode分享的全部内容。如果是对大家有用,需要了解更多的C#学习教程,希望大家多多关注---readonlystaticint_hash_sz=IntPtr.Size==4?0x2d2816fe:0x162a16fe;publicstaticunsafeintGetStringHashCode(thisStrings){///注意:x64字符串哈希忽略嵌入''char后的余数(与x86不同)if(s.Length==0||(IntPtr.Size==8&&s[0]==''))return_hash_sz;固定(char*p=s)returnIntPtr.Size==4?GetHashCode_x86_NET((int*)p,s.Length):GetHashCode_x64_NET(p);}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处: