JAVA 和 PHP md5 加密后的值不一致

大黑
  • 644

想要将一段 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;

回复
阅读 5.4k
3 个回答
✓ 已被采纳

JAVA 代码中的 PHP 实现如下,注意返回的数组第一个索引值是 1
function md5($key) {

 return unpack("c*", md5($key,true));

}

非墨
  • 2.1k

然后呢?什么结果?一致就没啥可说的了。

代码太长没看,java 取 md5 串的话我也有一个简单的,已测试与 php 的 md5 结果一致,见 https://github.com/ihongs/Hon...

md5 算法 应该都是一样的, 怎么会不同。

宣传栏