鍍金池/ 問答/Java  PHP  C/ JAVA 和 PHP md5 加密后的值不一致

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

想要將一段 JAVA 實現(xiàn)的一致性哈希用 PHP 代碼實現(xiàn)出來,但是不太懂 JAVA, 搜索了下資料大概知道是因為 JAVA 和 PHP md5 加密后的值對不上,所以問題變成了如何用 PHP 代碼實現(xiàn) JAVA 已經(jīng)寫好的 md5 加密,JAVA 代碼省略了部分非關(guān)鍵代碼

一致性哈希具體原理可以參考 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環(huán)列表(50張)
    private static List<String> fiftyServers = Arrays.asList(fiftyTables);
   
    //根據(jù)字段獲取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
{
    .........

    /**
     * 根據(jù) key 來獲取對應(yīng)的 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;

回答
編輯回答
浪婳

JAVA 代碼中的 PHP 實現(xiàn)如下,注意返回的數(shù)組第一個索引值是 1
function md5($key) {

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

}

2017年3月6日 04:14
編輯回答
裸橙

md5 算法 應(yīng)該都是一樣的, 怎么會不同。

2018年7月25日 22:07
編輯回答
雨萌萌

然后呢?什么結(jié)果?一致就沒啥可說的了。

代碼太長沒看,java 取 md5 串的話我也有一個簡單的,已測試與 php 的 md5 結(jié)果一致,見 https://github.com/ihongs/Hon...

2018年7月15日 00:14