最近在做文本处理,使用MD5 生成一段文字的MD5哈希长度为32位也即128个0-1序列。

由于需要对这个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循环移位时长度自动缩减的更多相关文章

  1. Java字符串转16 进制工具类Hex.java

    Java字符串转16 进制工具类Hex.java 学习了:https://blog.csdn.net/jia635/article/details/56678086 package com.strin ...

  2. HexDump.java解析,android 16进制转换

    HexDump.java解析android 16进制转换 package com.android.internal.util; public class HexDump { private final ...

  3. java中Integer包装类的具体解说(java二进制操作,全部进制转换)

    程序猿都非常懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往须要操作Integer,或者各种进制的转换等等.我今天就为大家具体解说一下Integer的使用吧.看代码: ...

  4. 【搬砖】安卓入门(2)- Java开发编程基础--进制转换和运算符

    02.01_Java语言基础(常量的概述和使用)(掌握) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 ...

  5. Java基础笔记(3) 进制与进制转换

    ---恢复内容开始--- 进制 在一般生活中,我们一直在应用的十进制,就是逢十进一,而今天我们要接触的是,计算机编程常用的进制!首先我们要知道,计算机内部运算采用的是二进制,也就是逢二进制! 1.什么 ...

  6. java基础语法以及进制的转换

    关键字 关键字: 被Java语言赋予特定含义的单词 关键字特点 组成关键字的字母全部小写 关键字注意事项 goto和const作为保留字存在,目前并不使用 类似IDEA这样的集成工具,针对关键字有特殊 ...

  7. SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0

    最近做项目扩展的时候,遇到问题就是将整型转换成指定长度的16进制 刚开始就是直接使用 cast(12 as varbinary(4))但是发现这个不能解决我的问题 所以就上网搜了一下,然后改了改,下面 ...

  8. java 字符串转16进制的方法

    方法一: 用java自带的方法 先将字符串转为字符数组,然后用Integer.toHexString方法进行转换. 缺点:中文容易乱码 方法二: 使用apache的包codec中的方法 org.apa ...

  9. 【Java】7.0 进制转换

    [二进制转十进制] public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.p ...

随机推荐

  1. 全响应跨设备的Zoomla!逐浪CMS2 x2.0正式公布

    2014年是中国互联网的重要一年,京东上市.聚美优品领衔创业风范,小米进军国际化.滴滴快的锋火争雄. 作为中国互联网的中间力量,Zoomla!逐浪软件团队坚守信念,始终以WEB开发和科研创新为己任,并 ...

  2. 事关Animation Tree的工作随笔(二)

    上回说到,游戏项目中客观会遇到逻辑状态的复杂性和动画状态的单一性之间的矛盾,那么Animation Tree是如何解决这个问题的呢? 这又需要引入一个定律:就是逻辑状态无论有多么复杂,但一套逻辑状态组 ...

  3. ARM指令集——条件执行、内存操作指令、跳转指令

    ARM 汇编指令条件执行 在ARM模式下,任何一条数据处理指令可以选择是否根据操作的结果来更新CPSR寄存器中的ALU状态标志位.在数据处理指令中使用S后缀来实现该功能. 不要在CMP,CMN,TST ...

  4. c#基础: 线程的初级用法总结

    启动一个线程的两种方法:     a.使用无参的方法       Thread thread1 = new Thread(new ThreadStart("调用的方法名")):   ...

  5. css_day6

  6. nignx日志格式

    web-master的nginx格式: log_format web_format '$remote_addr $remote_port $remote_user [$time_local] ' '& ...

  7. OpenGL ES 2.0 绘制方式

    OpenGL ES 中支持的绘制方式大致分3类,包括点.线段.三角形,每类中包括一种或多种具体的绘制方式. GL_POINTS 传入渲染管线的一系列顶点单独进行绘制. GL_LINES   传入渲染管 ...

  8. C++中的函数指针用法

    代码: #include <iostream> #include <cstdio> typedef void (*FUN)(); using namespace std; vo ...

  9. DoctrineMigrationsBundle

    数据库迁移特征是数据库抽象层的扩展,允许你用编程的方式,安全.方便.标准化实现数据库结构的更新. 安装 首先使用composer安装 $ composer require doctrine/doctr ...

  10. Android开发重修

    Android程序开发的重新学习 #####Mars课程学习笔记20140926 1.Service主要用于完成耗时较长的操作,没有图形化界面. 2.Content Provider数据的提供者,是A ...