JAVA 和 PHP md5 加密后的值不一致
想要将一段 JAVA 实现的一致性哈希用 PHP 代码实现出来,但是不太懂 JAVA, 搜索了下资料大概知道是因为 JAVA 和 PHP md5 加密后的值对不上,所以问题变成了如何用 PHP 代码实现 JAVA 已经写好的 md5 加密,JAVA 代码省略了部分非关键代码
一致性哈希具体原理可以参考 https://my.oschina.net/yaohon...
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;
public class TableHashRouteUtils {
private TableHashRouteUtils() {
}
/**
* 分表时选中类型:50张分
*/
public static final String TABLE_SELECT_FIFTY = "fifty";
//Hash环列表(50张)
private static List<String> fiftyServers = Arrays.asList(fiftyTables);
//根据字段获取hash值选择器(50张)
private static ConsistentHashSelector fiftySelector = new ConsistentHashSelector(fiftyServers);
/**
* md5加密
*
* @param value
* @return
*/
private byte[] md5(String value) {
MessageDigest md5;
try {
md5 = MessageDigest.getInstance("MD5");
} catch (NoSuchAlgorithmException e) {
throw new IllegalStateException(e.getMessage(), e);
}
md5.reset();
byte[] bytes = null;
try {
bytes = value.getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
throw new IllegalStateException(e.getMessage(), e);
}
md5.update(bytes);
return md5.digest();
}
/**
* 获取hash值
*
* @param digest
* @param number
* @return
*/
private long hash(byte[] digest, int number) {
return (((long) (digest[3 + number * 4] & 0xFF) << 24)
| ((long) (digest[2 + number * 4] & 0xFF) << 16)
| ((long) (digest[1 + number * 4] & 0xFF) << 8)
| (digest[number * 4] & 0xFF))
& 0xFFFFFFFFL;
}
}
public static void main(String[] args) {
System.out.println(doSelect("6340194558965481472L",TABLE_SELECT_FIFTY));
}
}
自己写的 PHP 版本
class ConsistentHashSelector
{
.........
/**
* 根据 key 来获取对应的 md5 的值
* @param $key
* @return string
*/
protected function md5($key)
{
return md5($key, true);
}
/**
* hash 算法
* @param $digest
* @param $start
* @return int
*/
protected function hash($digest, $start)
{
return ((($digest[3 + $start * 4] & 0xFF) << 24)
| (($digest[2 + $start * 4] & 0xFF) << 16)
| (($digest[1 + $start * 4] & 0xFF) << 8)
| ($digest[$start * 4] & 0xFF))
& 0xFFFFFFFF;
}
}
$fiftyTable = range(1, 50);
$fiftyTableSector = new ConsistentHashSelector($fiftyTable);
$node = $fiftyTableSector->select('6340194558965481472L');
echo 'node =' . $node;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
JAVA 代码中的 PHP 实现如下,注意返回的数组第一个索引值是 1
function md5($key) {
}
然后呢?什么结果?一致就没啥可说的了。
代码太长没看,java 取 md5 串的话我也有一个简单的,已测试与 php 的 md5 结果一致,见 https://github.com/ihongs/Hon...
md5 算法 应该都是一样的, 怎么会不同。