java BingInteger生成2进制String循环移位时长度自动缩减
最近在做文本处理,使用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循环移位时长度自动缩减的更多相关文章
- Java字符串转16 进制工具类Hex.java
Java字符串转16 进制工具类Hex.java 学习了:https://blog.csdn.net/jia635/article/details/56678086 package com.strin ...
- HexDump.java解析,android 16进制转换
HexDump.java解析android 16进制转换 package com.android.internal.util; public class HexDump { private final ...
- java中Integer包装类的具体解说(java二进制操作,全部进制转换)
程序猿都非常懒,你懂的! 今天为大家分享的是Integer这个包装类.在现实开发中,我们往往须要操作Integer,或者各种进制的转换等等.我今天就为大家具体解说一下Integer的使用吧.看代码: ...
- 【搬砖】安卓入门(2)- Java开发编程基础--进制转换和运算符
02.01_Java语言基础(常量的概述和使用)(掌握) A:什么是常量 在程序执行的过程中其值不可以发生改变 B:Java中常量的分类 字面值常量 自定义常量(面向对象部分讲) C:字面值常量的分类 ...
- Java基础笔记(3) 进制与进制转换
---恢复内容开始--- 进制 在一般生活中,我们一直在应用的十进制,就是逢十进一,而今天我们要接触的是,计算机编程常用的进制!首先我们要知道,计算机内部运算采用的是二进制,也就是逢二进制! 1.什么 ...
- java基础语法以及进制的转换
关键字 关键字: 被Java语言赋予特定含义的单词 关键字特点 组成关键字的字母全部小写 关键字注意事项 goto和const作为保留字存在,目前并不使用 类似IDEA这样的集成工具,针对关键字有特殊 ...
- SQL SERVER 自定义函数 整数转成指定长度的16进制 转换成指定长度的16进制 不足补0
最近做项目扩展的时候,遇到问题就是将整型转换成指定长度的16进制 刚开始就是直接使用 cast(12 as varbinary(4))但是发现这个不能解决我的问题 所以就上网搜了一下,然后改了改,下面 ...
- java 字符串转16进制的方法
方法一: 用java自带的方法 先将字符串转为字符数组,然后用Integer.toHexString方法进行转换. 缺点:中文容易乱码 方法二: 使用apache的包codec中的方法 org.apa ...
- 【Java】7.0 进制转换
[二进制转十进制] public static void main(String args[]) { Scanner sc = new Scanner(System.in); System.out.p ...
随机推荐
- HDU 3622 Bomb Game(2-sat)
HDU 3622 Bomb Game 题目链接 题意:求一个最大半径,使得每一个二元组的点任选一个,能够得到全部圆两两不相交 思路:显然的二分半径,然后2-sat去判定就可以 代码: #include ...
- oracle 同样数据删除(仅仅留一条)
DELETE FROM reg_user t1 WHERE user_name='9527008' and rowid > ( SELECT min(rowid) FROM location t ...
- Activity中的startActivityResult,setResult,finish,onActivityResult的关系
一:首先图示: 二:代码: 1:方法selectName public void selectName(View view){ Intent intent = new Intent(this,Name ...
- [Redux] Redux: Extracting Container Components -- AddTodo
Code to be refactored: const AddTodo = ({ onAddClick }) => { let input; return ( <div> < ...
- 使用apktool解包和打包apk
使用apktool解包和打包apk 下载apktool工具 解包 apktool d xxx.apk -f 植入代码 使用apktool解包要植入代码的apk(下面称为A), 使用apktool解包包 ...
- css3 tranform transition animation
tranform:对象图形变形 tranform的属性包括: 1.none 表示不进行变换: 2.rotate 旋转 transform:rotate(20deg) 旋转 ...
- AngularJs练习Demo10 ngInclude
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...
- Thread 常搞混的几个概念sleep、wait、yield、interrupt (转)
原文网址:http://blog.csdn.net/partner4java/article/details/7993420sleep:在指定的毫秒数内让当前正在执行的线程休眠(暂停执行),此操作受到 ...
- Maybe I go too extreme
昨天拖着一个没睡好的身体去面试了2家公司 被问到Collection的子集的时候顿时傻了一会,明明很简单的问题一时就想不起来了,哈哈.果然做it的人身体要顾好,状态太差了. 发现了一个问题,其实也是早 ...
- 基尔霍夫矩阵题目泛做(AD第二轮)
题目1: SPOJ 2832 题目大意: 求一个矩阵行列式模一个数P后的值.p不一定是质数. 算法讨论: 因为有除法而且p不一定是质数,不一定有逆元,所以我们用辗转相除法. #include < ...