鍍金池/ 問答/Java  PHP  數(shù)據(jù)庫(kù)  網(wǎng)絡(luò)安全/ 大家 mysql 分表的哈希算法是怎樣的?

大家 mysql 分表的哈希算法是怎樣的?

比如把 users 用戶表分為 100 個(gè)表,users_1 ~ users_100,可以根據(jù) userid 進(jìn)行哈希,這樣分成 100 張表,我們的算法是:

function hashID($id, $max)
{
    $md5 = md5($id);
    $str1 = substr($md5, 0, 2);
    $str2 = substr($md5, -2, 2);
    $newStr = intval(intval($str1 . $str2, 16));
    $hashID = $newStr % $max + 1;
    return $hashID;
}

參數(shù) $id ,就是分表的字段,如 userid,$max 是分成多少?gòu)埍怼?/p>

為什么不直接 userid%100+1 這樣獲取分表呢?分布也是比較均勻的吧,為什么要采用如上的函數(shù),各位業(yè)務(wù)中分表的算法是怎樣的?

回答
編輯回答
祈歡

963,1040,1008,1016,992,1010,997,1000,1025,998,971,1036,962,998,972,954,1040,931,953,1018,1054,992,934,983,1027,973,1021,1044,997,1010,1062,978,988,1028,972,986,979,922,1032,924,993,1055,1054,1031,1023,981,1027,1017,1005,1031,1004,1009,994,1004,967,1026,1016,984,1032,987,1053,964,978,983,985,992,948,1061,1068,993,933,1028,967,1010,1007,962,1018,978,1003,1036,1001,1021,1006,1006,1041,1022,971,957,956,1007,1023,952,1011,988,991,984,1020,1025,1003,1018

這個(gè)10000個(gè)數(shù)分100個(gè)表,平均每個(gè)表數(shù)的總個(gè)數(shù),分布的很均勻了好吧。
然后用哈希速度快,也很裝逼有木有^_^
圖片描述

2017年1月21日 11:15
編輯回答
選擇

crc32 + 取模 簡(jiǎn)單

2018年3月14日 21:59
編輯回答
悶油瓶

分表hash算法有多種,我們?cè)瓉?lái)分0-9,也搞過(guò)md5取最后一位0-9a-z,這個(gè)沒有絕對(duì)的好壞只說(shuō),看量吧。

至于不能直接用%,需要考慮大整數(shù)溢出的問題:
2的32次方:4294967296

4294967296%100 // 結(jié)果為0
fmod(4294967296, 100) // 為96

簡(jiǎn)單的辦法就是substr($str, -2);

2017年7月29日 08:50
編輯回答
命多硬

少用% 取模 擴(kuò)展表的話就蛋疼了

2017年8月22日 03:02