• 你知道吗string GetHashCode方法跟环境是有关的吗?


    系统被测出一个bug,在本地正常在服务器上不正常代码完全全部重传了一遍还是不正常。
    后面突然想到我用的是hashcode.
    会不会是同一个iis下,当是站点不一样造成hashcode的计算结果不一样。

    然后就开LinqPad起来测试发现 GetHashCode()方法跟环境确实有关系。


    然后我们再试一下在asp.net环境当中的

     

    还是只有两个一样的值,这回有意思了, 没有出现新的值。
    我们期待的是有新的不同的值,这样就可以直接证明它的值是跟运行环境有关了。 不同环境得到的值都不一样。

    用Reflector看一下它的代码是什么写的, 直接看还真的是看不出有跟环境有关的代码

     
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
    public override unsafe int GetHashCode()
    {
        
    fixed (char* str = ((char*this))
        {
            
    char* chPtr = str;
            
    int num = 0x15051505;
            
    int num2 = num;
            
    int* numPtr = (int*) chPtr;
            
    for (int i = this.Length; i > 0; i -= 4)
            {
                num 
    = (((num << 5+ num) + (num >> 0x1b)) ^ numPtr[0];
                
    if (i <= 2)
                {
                    
    break;
                }
                num2 
    = (((num2 << 5+ num2) + (num2 >> 0x1b)) ^ numPtr[1];
                numPtr 
    += 2;
            }
            
    return (num + (num2 * 0x5d588b65));
        }
    }

    这时候我突然想到的是会不会 64位 或32位的问题,因为我的操作系统是64位的,然后虚拟机是32位的。
    接下来我就继续测试一下IIS的设置看看是不是真的是这个问题

     

    可以通过改IIS里面的Application pool ,果然是哪个问题。当设置成64位的时候哪个值是1670610771 32位的值是1152132852 
    确定了之后我们就可以用Reflector加载64位的dll来查看它的代码 
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.MayFail)]
    public override unsafe int GetHashCode()
    {
        
    fixed (char* str = ((char*this))
        {
            
    int num3;
            
    char* chPtr = str;
            
    int num = 0x1505;
            
    int num2 = num;
            
    for (char* chPtr2 = chPtr; (num3 = chPtr2[0]) != '\0'; chPtr2 += 2)
            {
                num 
    = ((num << 5+ num) ^ num3;
                num3 
    = chPtr2[1];
                
    if (num3 == 0)
                {
                    
    break;
                }
                num2 
    = ((num2 << 5+ num2) ^ num3;
            }
            
    return (num + (num2 * 0x5d588b65));
        }
    }

    两个是不一样的。
    原来影响它的环境只是 net framework 版本的不同造成的

  • 相关阅读:
    阿里巴巴FastJSON使用实例
    JSON知识点
    java序列化和反序列化
    JAVA里的VO、BO、PO分别指什么?
    Oracle基础语句练习记录
    maven命令
    maven官方教程
    linux下开启、关闭、重启mysql服务
    linux常用命令记录
    动态网页项目无法启动
  • 原文地址:https://www.cnblogs.com/lovebanyi/p/1846725.html
Copyright © 2020-2023  润新知