java BingInteger生成2进制String循环移位时长度自动缩减
2013-07-27 21:03
441 查看
最近在做文本处理,使用MD5 生成一段文字的MD5哈希长度为32位也即128个0-1序列。
由于需要对这个MD5值进行循环移位,显然普通的 int 是不行的,所以使用 BigInteger。但是在使用BigInteger进行移位的过程,生成的0-1 序列长度 莫名其妙的减少。如图:
生成MD5 哈希码代码如下:
将生成的MD5哈希码(128位)转换为相应的 BigInteger,其中的file为需要转换的文件
接下来对生成的MD5 的BigInteger 循环移位16次,生成16个不同哈希。注意此时移位过程中生成的0-1序列,最开始是有128位,然后一边移位一边减少。如图:
通过观察输出结果,发现位数缩减的主要原因是:如果生成的0-1序列首位是0(可能有多个), 从这个序列再还原到BigInteger时 原数就发生了变化,而下一步的移位是以上一步为基础,导致越到后面位数越少。
修改之后:
由于需要对这个MD5值进行循环移位,显然普通的 int 是不行的,所以使用 BigInteger。但是在使用BigInteger进行移位的过程,生成的0-1 序列长度 莫名其妙的减少。如图:
生成MD5 哈希码代码如下:
public class MD5 { public final static String MD5(String s){ char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; try{ byte[] biInput=s.getBytes(); //获得MD5 摘要算法的MessageDigest对象 MessageDigest mdInst=MessageDigest.getInstance("MD5"); //使用指定的字节更新摘要 mdInst.update(biInput); //获得密文 byte[] md=mdInst.digest(); int j=md.length; char str[]=new char[j*2]; int k=0; for(int i=0;i<j;i++) { byte byte0=md[i]; str[k++]=hexDigits[byte0>>>4&0xf]; str[k++]=hexDigits[byte0&0xf]; } return new String(str); }catch(Exception e){ e.printStackTrace(); return null; } } public String MD5ToBinary(String s){ StringBuilder a=new StringBuilder(); return a.toString(); }
将生成的MD5哈希码(128位)转换为相应的 BigInteger,其中的file为需要转换的文件
BigInteger all_md5 =new BigInteger(MD5.MD5(file),16);
接下来对生成的MD5 的BigInteger 循环移位16次,生成16个不同哈希。注意此时移位过程中生成的0-1序列,最开始是有128位,然后一边移位一边减少。如图:
通过观察输出结果,发现位数缩减的主要原因是:如果生成的0-1序列首位是0(可能有多个), 从这个序列再还原到BigInteger时 原数就发生了变化,而下一步的移位是以上一步为基础,导致越到后面位数越少。
/** * 循环移位16次获得16个指纹,并将所有指纹加入到列表中 */ for (int i = 0; i < 16; i++) { String d =CircleLeftmoveBit(all_md5,8); all_md5=new BigInteger(d,2); fingerList.add(d); } return fingerList; } } /** * 先讲MD5哈希值变成2进制字符串表示,然后截取前num位和尾部,改变两截的放置顺序即可完成循环移位 * @param in 传入的需要循环移位的BigInteger * @param num 需要移位位数 * @return 返回移位完成的2进制字符串 */ public static String CircleLeftmoveBit(BigInteger in,int num){ String tmp=in.toString(2); //返回MD5哈希的2进制表示串 /** * 由于BigInteger 自动省略了前面的0,所以我们需要补全 */ int zero_num=128-tmp.length(); for(int i=0;i<zero_num;i++) { tmp+="0"; } String bit_s=""; String s1=tmp.substring(0, num); String s2=tmp.substring(num, tmp.length()); bit_s=s2+s1; return bit_s; }
修改之后:
相关文章推荐
- java BingInteger生成2进制String循环移位时长度自动缩减
- java BingInteger生成2进制String循环移位时长度自动缩减
- Java生成固定长度的字符串,长度不足自动填充指定字符
- Java中字符串字面量是否自动生成一个String对象?
- 创建android项目时没有自动生成R.java文件的解决方法
- java-web-PIO实现自动生成excel录入模板(实现下拉列表框)[原创]
- eclipse中的Java文件自动根据svn版本号生成注释
- 在ubuntu下eclipse中一键调用javah自动生成头文件
- java DMO及增删改查代码的自动生成
- R.java 无法自动生成
- java 服务器自动生成plist文件案例
- Java中 键盘录入Scanner,String与 Integer数据类型转换
- Java 包装类 自动装箱和拆箱--Integer
- js和java中string的长度
- JAXB注解 java 关于xml的注解,自动生成xml文件 - @XML***
- 使用Excel自动生成Java中的Model类
- 利用python操作android的xml资源文件,让其按照中文自动生成对应中文首字母加起来的名字,并且根据中文在java类里面替代对应的中文
- Java Web - SM(SpringMVC + Mybatis) 代码自动生成
- eclipse下编写android程序突然不会自动生成R.java文件和包的解决办法