一个意想不到的问题

以专业开发人员为伍 2018-04-24 05:59:25
今天有时间去解决一下某个系统移植数据库到其它服务器上的问题,发现 MD5CryptoServiceProvider(以及其它几个类似的散列方法)的 ComputeHash 计算结果,在不同机器上完全不一样。这样,来自不同机器计算的散列值都乱了。

你们的机器上也是如此吗?如果真的如此,那么 .net 中的有关的 ComputeHash 要整体废掉了,因为毕竟我们要考虑多服务器的问题(比如说一台机器坏掉了,立刻用另一台机器顶上,此时不能让系统垮掉啊)。

如果知道这个原因的,请说明一下。微软对于 .net 的 ComputeHash 这个特性有文档说明吗?还是我测试错误?
...全文
1276 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yflh2 2019-01-04
  • 打赏
  • 举报
回复
https://bbs.csdn.net/topics/260084619 求多点之间的最短路径算法(至少是4点) 您好 这个怎么解,有思路吗
  • 打赏
  • 举报
回复
顺丰的路由推送接口设置了一个URL地址,但顺丰推送时没有走进我写的方法,能帮一下忙吗
CalvinR 2018-05-24
  • 打赏
  • 举报
回复
大神也用md5加密啊 我还以为会用别的加密方式呢
qq_36466995 2018-05-22
  • 打赏
  • 举报
回复
大神,我能拜你为师么。。。弱弱的小白
  • 打赏
  • 举报
回复
大神,有个问题很急,有时间您回复一下帖子https://bbs.csdn.net/topics/392379304
_明月 2018-05-11
  • 打赏
  • 举报
回复
学习了,路过。
正怒月神 2018-05-04
  • 打赏
  • 举报
回复
引用 10 楼 zhaowei705523962 的回复:
[quote=引用 1 楼 hanjun0612 的回复:] 我测试了md5加密,都是一样的。(2台机器结果相同)
static void Main(string[] args)
        {
            //结果:c1ba5951c95dd17dcbcbdd451a999978

            //Func1
            MD5 md5Hasher = MD5.Create();
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            Console.WriteLine(sBuilder);


            //Func2
            MD5CryptoServiceProvider md5Hasher1 = new MD5CryptoServiceProvider();
            byte[] data1 = md5Hasher1.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
            StringBuilder sBuilder1 = new StringBuilder();

            for (int i = 0; i < data1.Length; i++)
            {
                sBuilder1.Append(data[i].ToString("x2"));
            }
            Console.WriteLine(sBuilder1);


            //Func3
            string str1 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("myTest+123", "MD5").ToUpper();
            Console.WriteLine(str1);


            Console.ReadLine();
        }
400分啊。一下子这么多,还真不大适应[/quote] 哈哈,是的,感觉突然成为了暴发户
wrzs 2018-05-04
  • 打赏
  • 举报
回复
引用 1 楼 hanjun0612 的回复:
我测试了md5加密,都是一样的。(2台机器结果相同)
static void Main(string[] args)
        {
            //结果:c1ba5951c95dd17dcbcbdd451a999978

            //Func1
            MD5 md5Hasher = MD5.Create();
            byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i < data.Length; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }
            Console.WriteLine(sBuilder);


            //Func2
            MD5CryptoServiceProvider md5Hasher1 = new MD5CryptoServiceProvider();
            byte[] data1 = md5Hasher1.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
            StringBuilder sBuilder1 = new StringBuilder();

            for (int i = 0; i < data1.Length; i++)
            {
                sBuilder1.Append(data[i].ToString("x2"));
            }
            Console.WriteLine(sBuilder1);


            //Func3
            string str1 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("myTest+123", "MD5").ToUpper();
            Console.WriteLine(str1);


            Console.ReadLine();
        }
400分啊。一下子这么多,还真不大适应
  • 打赏
  • 举报
回复
发现了,哈哈,我们代码中写
MD5(Encoding.UTF8.GetBytes(pass + "........." + pass.Reverse()))
这种代码,最后边的函数返回的是 .net 的类型描述,结果我们测试的4台机器竟然是各个机器 .net 返回的这个 Reverse().ToString 各不相同。也巧了,假设有两台机器返回的一样,就不至于误解了。 这个代码改成了
MD5(Encoding.UTF8.GetBytes(pass + "........" + string.Join("", pass.Reverse())))
正怒月神 2018-04-24
  • 打赏
  • 举报
回复
@sp1234 我追问一下,最后发现是什么原因了吗?
正怒月神 2018-04-24
  • 打赏
  • 举报
回复
引用 3 楼 sp1234 的回复:
唯一的区别就是编码不同
            MD5CryptoServiceProvider md5Hasher1 = new MD5CryptoServiceProvider();
            byte[] data1 = md5Hasher1.ComputeHash(Encoding.UTF8.GetBytes("123456afafliolasdfa"));
我们在三台不同架构类型CPU的机器上,有完全三个结果。我也希望是看错了,可是这真是不一样啊?!
我在两台机器上测试了utf8编码 结果还是一样。
  • 打赏
  • 举报
回复
欸,不对啊,UTF8 测试也没有问题。
xuzuning 2018-04-24
  • 打赏
  • 举报
回复
有中文才会是编码原因 ASCII 在各种编码中都是一样的
  • 打赏
  • 举报
回复
看来有可能是 Encoding.UTF8 的问题了。
  • 打赏
  • 举报
回复
唯一的区别就是编码不同
            MD5CryptoServiceProvider md5Hasher1 = new MD5CryptoServiceProvider();
            byte[] data1 = md5Hasher1.ComputeHash(Encoding.UTF8.GetBytes("123456afafliolasdfa"));
我们在三台不同架构类型CPU的机器上,有完全三个结果。我也希望是看错了,可是这真是不一样啊?!
正怒月神 2018-04-24
  • 打赏
  • 举报
回复
忘记说了,是2台机器都试过了。结果一样
正怒月神 2018-04-24
  • 打赏
  • 举报
回复
我测试了md5加密,都是一样的。(2台机器结果相同)

static void Main(string[] args)
{
//结果:c1ba5951c95dd17dcbcbdd451a999978

//Func1
MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
Console.WriteLine(sBuilder);


//Func2
MD5CryptoServiceProvider md5Hasher1 = new MD5CryptoServiceProvider();
byte[] data1 = md5Hasher1.ComputeHash(Encoding.Default.GetBytes("myTest+123"));
StringBuilder sBuilder1 = new StringBuilder();

for (int i = 0; i < data1.Length; i++)
{
sBuilder1.Append(data[i].ToString("x2"));
}
Console.WriteLine(sBuilder1);


//Func3
string str1 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("myTest+123", "MD5").ToUpper();
Console.WriteLine(str1);


Console.ReadLine();
}
内容概要:本文介绍了基于条件生成对抗网络(Conditional Generative Adversarial Networks, CGAN)的可再生能源日前场景生成方法的复现研究,旨在通过Python代码实现对风电、光伏等可再生能源出力的不确定性进行高效建模与多场景生成。该方法利用历史数据作为条件输入,训练生成器与判别器网络,从而生成符合实际统计特性的高精度出力场景集,有效支撑电力系统调度、规划与风险评估等应用。文中详细阐述了CGAN的网络结构设计、损失函数构建、训练流程优化及生成场景的质量评价指标,并提供了完整的代码实现与案例分析,验证了其在捕捉时空相关性与概率分布方面的优越性。; 适合人群:具备一定深度学习与电力系统基础知识,从事新能源预测、电力系统优化调度、场景生成等相关方向的科研人员及研究生。; 使用场景及目标:①用于可再生能源出力不确定性建模,生成满足日前调度需求的典型场景集;②支撑含高比例新能源的电力系统随机优化、鲁棒调度与风险评估研究;③为学术研究提供可复现的CGAN应用场景与代码参考。; 阅读建议:建议读者结合提供的Python代码逐模块学习,重点关注数据预处理、模型搭建与训练细节,通过调整超参数和输入数据进行实验对比,深入理解CGAN在电力系统场景生成中的实际应用价值。

111,130

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧