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 ...
随机推荐
- 几道php基础面试题
前言 昨晚实验室一师弟在微薄上@我,给我发了几道php的基础面试题,这里把我写的答案贴出来 题目 (1)写一个函数获取URL的文件后缀,例如“http://www.feiyan.info/test.p ...
- JAVA学习第三十课(经常使用对象API)- String类:类方法练习
intern方法 public class Main { public static void main(String[] args) { String str1 = new String(" ...
- Learning Lua Programming (3) iMac下搭建Lua脚本最好的编码环境(代码补全,编译运行)
这篇文章参考自http://blog.sina.com.cn/s/blog_991afe570101rdgf.html,十分感谢原作者的伟大创造,本人亲测可行. 这篇文章记录一下如何在MAC系统环境下 ...
- Swift自适应布局(Adaptive Layout)教程(二)
给TextContainer中添加内容 打开 Main.storyboard ,从组件库(Object Library)中拖拽两个 Label 组件到TextContainer中,位置可以随意摆放: ...
- WAS集群系列(6):集群搭建:步骤4:安装WAS升级软件
逐步点击"下一步",注意一处流程,例如以下列举: "升级软件"安装的路径设置,建议与之前的WAS及IHS安装的绝对路径同样,例如以下所看到的: 逐步点击,完毕安 ...
- C++11 lambda 表达式
C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lamb ...
- SQL中将某个表中的多行数据在一个字段显示
项目需求:将某个表中的多行数据在一个字段显示,如下: 比如表A中有字段 ID,NAME, 表B中有字段ID,PID,DES, 表A,表B中的数据分别如下: ID NAME1 张三2 李四 ID PID ...
- linux install zh_CN(ubuntu)
cd /usr/share/locales sudo ./install-language-pack zh_CN
- trim()方法去除字符串首尾空格
trim()方法去除字符串首尾空格 1.原生js Function trimStr(str){ Return str.r ...
- WordPress插件制作教程(五): 创建新的数据表
上一篇讲解了怎样将数据保存到数据库,今天为大家讲解创建新的数据表,也就是说当我们激活插件的时候,会在该数据库下面创建一个新的数据表出来.原理很简单,激活插件的时候运行创建数据库的代码.看下面代码: & ...