zoukankan      html  css  js  c++  java
  • 字符串生成Hash值后转换成Guid的若干方法和一个重要问题

    字符串计算成Hash值的代码如下:

    MD5 md5 = MD5.Create();
    byte[] data = System.Text.Encoding.Default.GetBytes(str);
    byte[] md5data = md5.ComputeHash(data);
     
    计算出Hash值后,结果是一堆byte, 不方便多个hash值进行比较.
    由于Hash值计算出来是一个128位的值, 转换成字符串表达形式就好对比多了,也就是MD5码的字符串形式, 另外由于Guid也是128位的,所以可以用guid来存储这个MD5码.
     
    先说一种不正规的MD5生成方法: 
    return new Guid(md5data);
    请注意: 这种方式生成的Guid和下面几种方式生成的guid的结果是不一样的,并不是说就是错误的, 使用的时候需要注意.  
     
    生成Guid有几种方法(这几种方式生成的guid是正确的):
    一:
    for (int i = 0; i < md5data.Length; ++i)
    {
          str += md5data[i].ToString("x").PadLeft(2, '0');
    }
    return new Guid(str);

    二:

    int first4 = byteToInt32(md5data, 0);
    short next2 = byteToInt16(md5data, 4);
    short next3 = byteToInt16(md5data, 6);
    return new Guid(first4, next2, next3, ne);
     
    为什么new Guid(md5data)这种方法是错误的呢.
    因为这种方法调用底层Win32的方法转换字符与byte,而.net与C在字节的高位顺序上是相反的, 所以会出现前16位不一致的情况.导致计算出来的MD5码不正确.
     
    后两种方法的思路是先计算出来MD5码,然后生成Guid,这样md5码就不会受到高地位的影响. 
    但是要注意一个问题: 后两种方法生成的guid, 调用ToByteArray生成的字节数值和md5data是不一样的. 
    所以我们要注意的是, 我们是使用Guid来存储Md5码,所以要先计算MD5(MD5码的算法是固定的).
     
  • 相关阅读:
    提高开发效率
    layer的alert图
    javascript改写 <select>checked的选中,并不会出发change事件,太好了!
    $.ajax 在请求没有完成,是可以往下继续执行js代码的
    解决 hibernate cannot define positional parameter after any named parameters have been defined
    el表达式便利map集合
    c/c++ 多线程 std::call_once的应用
    c/c++ 多线程 std::call_once
    c/c++ 多线程 unique_lock的使用
    c/c++ 多线程 层级锁
  • 原文地址:https://www.cnblogs.com/dunnice/p/2356205.html
Copyright © 2011-2022 走看看