bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

php數(shù)據(jù)庫哈希,php一致性哈希

如何解決PHP哈希函數(shù)的碰撞

哈希碰撞雖然是小概率事件,但絕對(duì)不能怕,更不能躲,尤其不能當(dāng)作“不存在”。一定要根據(jù)應(yīng)用的需求,有明確的方法對(duì)待之。我的建議,要么加長哈希算法的取值空間,要么增加其他的比較特征,作為在哈希算法之外額外的補(bǔ)充。

為古交等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及古交網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為做網(wǎng)站、網(wǎng)站制作、古交網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

長度越長,碰撞的幾率越小。減少長度必然增加碰撞幾率。因?yàn)槟闶前言目臻g隱射到哈希生成串的空間,串長度決定了空間的大小。

PHP如何創(chuàng)建hash碼型的db文件

手冊(cè)上寫了PHP的DBA庫只支持BTree型的db文件....不支持hash結(jié)構(gòu).

Hash型適合放在內(nèi)存或高速緩存中,早就可以用memcache等新工具代替

B樹的效率也很好在磁盤上最佳,PHP存在這個(gè)DBA庫也是為了兼容舊文件,而不是作為主力數(shù)據(jù)庫...

覺得應(yīng)該讓其他環(huán)境的代碼去兼容B樹型db文件,或者另用現(xiàn)代一點(diǎn)的數(shù)據(jù)庫更佳..

實(shí)在不行可以在centos的環(huán)境寫出一個(gè)webservice和PHP進(jìn)行無驅(qū)動(dòng)交換..

php的memcached分布式hash算法,如何解決分布不均?crc32這個(gè)算法沒辦法把key值均勻的分布出去

memcached的總結(jié)和分布式一致性hash

當(dāng)前很多大型的web系統(tǒng)為了減輕數(shù)據(jù)庫服務(wù)器負(fù)載,會(huì)采用memchached作為緩存系統(tǒng)以提高響應(yīng)速度。

目錄: ()

memchached簡介

hash

取模

一致性hash

虛擬節(jié)點(diǎn)

源碼解析

參考資料

1. memchached簡介

memcached是一個(gè)開源的高性能分布式內(nèi)存對(duì)象緩存系統(tǒng)。

其實(shí)思想還是比較簡單的,實(shí)現(xiàn)包括server端(memcached開源項(xiàng)目一般只單指server端)和client端兩部分:

server端本質(zhì)是一個(gè)in-memory key-value store,通過在內(nèi)存中維護(hù)一個(gè)大的hashmap用來存儲(chǔ)小塊的任意數(shù)據(jù),對(duì)外通過統(tǒng)一的簡單接口(memcached protocol)來提供操作。

client端是一個(gè)library,負(fù)責(zé)處理memcached protocol的網(wǎng)絡(luò)通信細(xì)節(jié),與memcached server通信,針對(duì)各種語言的不同實(shí)現(xiàn)分裝了易用的API實(shí)現(xiàn)了與不同語言平臺(tái)的集成。

web系統(tǒng)則通過client庫來使用memcached進(jìn)行對(duì)象緩存。

2. hash

memcached的分布式主要體現(xiàn)在client端,對(duì)于server端,僅僅是部署多個(gè)memcached server組成集群,每個(gè)server獨(dú)自維護(hù)自己的數(shù)據(jù)(互相之間沒有任何通信),通過daemon監(jiān)聽端口等待client端的請(qǐng)求。

而在client端,通過一致的hash算法,將要存儲(chǔ)的數(shù)據(jù)分布到某個(gè)特定的server上進(jìn)行存儲(chǔ),后續(xù)讀取查詢使用同樣的hash算法即可定位。

client端可以采用各種hash算法來定位server:

取模

最簡單的hash算法

targetServer = serverList[hash(key) % serverList.size]

直接用key的hash值(計(jì)算key的hash值的方法可以自由選擇,比如算法CRC32、MD5,甚至本地hash系統(tǒng),如java的hashcode)模上server總數(shù)來定位目標(biāo)server。這種算法不僅簡單,而且具有不錯(cuò)的隨機(jī)分布特性。

但是問題也很明顯,server總數(shù)不能輕易變化。因?yàn)槿绻黾?減少memcached server的數(shù)量,對(duì)原先存儲(chǔ)的所有key的后續(xù)查詢都將定位到別的server上,導(dǎo)致所有的cache都不能被命中而失效。

一致性hash

為了解決這個(gè)問題,需要采用一致性hash算法(consistent hash)

相對(duì)于取模的算法,一致性hash算法除了計(jì)算key的hash值外,還會(huì)計(jì)算每個(gè)server對(duì)應(yīng)的hash值,然后將這些hash值映射到一個(gè)有限的值域上(比如0~2^32)。通過尋找hash值大于hash(key)的最小server作為存儲(chǔ)該key數(shù)據(jù)的目標(biāo)server。如果找不到,則直接把具有最小hash值的server作為目標(biāo)server。

為了方便理解,可以把這個(gè)有限值域理解成一個(gè)環(huán),值順時(shí)針遞增。

如上圖所示,集群中一共有5個(gè)memcached server,已通過server的hash值分布到環(huán)中。

如果現(xiàn)在有一個(gè)寫入cache的請(qǐng)求,首先計(jì)算x=hash(key),映射到環(huán)中,然后從x順時(shí)針查找,把找到的第一個(gè)server作為目標(biāo)server來存儲(chǔ)cache,如果超過了2^32仍然找不到,則命中第一個(gè)server。比如x的值介于A~B之間,那么命中的server節(jié)點(diǎn)應(yīng)該是B節(jié)點(diǎn)

可以看到,通過這種算法,對(duì)于同一個(gè)key,存儲(chǔ)和后續(xù)的查詢都會(huì)定位到同一個(gè)memcached server上。

那么它是怎么解決增/刪server導(dǎo)致的cache不能命中的問題呢?

假設(shè),現(xiàn)在增加一個(gè)server F,如下圖

此時(shí),cache不能命中的問題仍然存在,但是只存在于B~F之間的位置(由C變成了F),其他位置(包括F~C)的cache的命中不受影響(刪除server的情況類似)。盡管仍然有cache不能命中的存在,但是相對(duì)于取模的方式已經(jīng)大幅減少了不能命中的cache數(shù)量。

虛擬節(jié)點(diǎn)

但是,這種算法相對(duì)于取模方式也有一個(gè)缺陷:當(dāng)server數(shù)量很少時(shí),很可能他們?cè)诃h(huán)中的分布不是特別均勻,進(jìn)而導(dǎo)致cache不能均勻分布到所有的server上。

如圖,一共有3臺(tái)server – 1,2,4。命中4的幾率遠(yuǎn)遠(yuǎn)高于1和2。

為解決這個(gè)問題,需要使用虛擬節(jié)點(diǎn)的思想:為每個(gè)物理節(jié)點(diǎn)(server)在環(huán)上分配100~200個(gè)點(diǎn),這樣環(huán)上的節(jié)點(diǎn)較多,就能抑制分布不均勻。

當(dāng)為cache定位目標(biāo)server時(shí),如果定位到虛擬節(jié)點(diǎn)上,就表示cache真正的存儲(chǔ)位置是在該虛擬節(jié)點(diǎn)代表的實(shí)際物理server上。

另外,如果每個(gè)實(shí)際server的負(fù)載能力不同,可以賦予不同的權(quán)重,根據(jù)權(quán)重分配不同數(shù)量的虛擬節(jié)點(diǎn)。

// 采用有序map來模擬環(huán)

this.consistentBuckets = new TreeMap();

MessageDigest md5 = MD5.get();//用MD5來計(jì)算key和server的hash值

// 計(jì)算總權(quán)重

if ( this.totalWeight for ( int i = 0; i this.weights.length; i++ )

this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];

} else if ( this.weights == null ) {

this.totalWeight = this.servers.length;

}

// 為每個(gè)server分配虛擬節(jié)點(diǎn)

for ( int i = 0; i servers.length; i++ ) {

// 計(jì)算當(dāng)前server的權(quán)重

int thisWeight = 1;

if ( this.weights != null this.weights[i] != null )

thisWeight = this.weights[i];

// factor用來控制每個(gè)server分配的虛擬節(jié)點(diǎn)數(shù)量

// 權(quán)重都相同時(shí),factor=40

// 權(quán)重不同時(shí),factor=40*server總數(shù)*該server權(quán)重所占的百分比

// 總的來說,權(quán)重越大,factor越大,可以分配越多的虛擬節(jié)點(diǎn)

double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );

for ( long j = 0; j factor; j++ ) {

// 每個(gè)server有factor個(gè)hash值

// 使用server的域名或IP加上編號(hào)來計(jì)算hash值

// 比如server - "172.45.155.25:11111"就有factor個(gè)數(shù)據(jù)用來生成hash值:

// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor

byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );

// 每個(gè)hash值生成4個(gè)虛擬節(jié)點(diǎn)

for ( int h = 0 ; h 4; h++ ) {

Long k =

((long)(d[3+h*4]0xFF) 24)

| ((long)(d[2+h*4]0xFF) 16)

| ((long)(d[1+h*4]0xFF) 8 )

| ((long)(d[0+h*4]0xFF));

// 在環(huán)上保存節(jié)點(diǎn)

consistentBuckets.put( k, servers[i] );

}

}

// 每個(gè)server一共分配4*factor個(gè)虛擬節(jié)點(diǎn)

}

// 采用有序map來模擬環(huán)

this.consistentBuckets = new TreeMap();

MessageDigest md5 = MD5.get();//用MD5來計(jì)算key和server的hash值

// 計(jì)算總權(quán)重

if ( this.totalWeight for ( int i = 0; i this.weights.length; i++ )

this.totalWeight += ( this.weights[i] == null ) ? 1 : this.weights[i];

} else if ( this.weights == null ) {

this.totalWeight = this.servers.length;

}

// 為每個(gè)server分配虛擬節(jié)點(diǎn)

for ( int i = 0; i servers.length; i++ ) {

// 計(jì)算當(dāng)前server的權(quán)重

int thisWeight = 1;

if ( this.weights != null this.weights[i] != null )

thisWeight = this.weights[i];

// factor用來控制每個(gè)server分配的虛擬節(jié)點(diǎn)數(shù)量

// 權(quán)重都相同時(shí),factor=40

// 權(quán)重不同時(shí),factor=40*server總數(shù)*該server權(quán)重所占的百分比

// 總的來說,權(quán)重越大,factor越大,可以分配越多的虛擬節(jié)點(diǎn)

double factor = Math.floor( ((double)(40 * this.servers.length * thisWeight)) / (double)this.totalWeight );

for ( long j = 0; j factor; j++ ) {

// 每個(gè)server有factor個(gè)hash值

// 使用server的域名或IP加上編號(hào)來計(jì)算hash值

// 比如server - "172.45.155.25:11111"就有factor個(gè)數(shù)據(jù)用來生成hash值:

// 172.45.155.25:11111-1, 172.45.155.25:11111-2, ..., 172.45.155.25:11111-factor

byte[] d = md5.digest( ( servers[i] + "-" + j ).getBytes() );

// 每個(gè)hash值生成4個(gè)虛擬節(jié)點(diǎn)

for ( int h = 0 ; h 4; h++ ) {

Long k =

((long)(d[3+h*4]0xFF) 24)

| ((long)(d[2+h*4]0xFF) 16)

| ((long)(d[1+h*4]0xFF) 8 )

| ((long)(d[0+h*4]0xFF));

// 在環(huán)上保存節(jié)點(diǎn)

consistentBuckets.put( k, servers[i] );

}

}

// 每個(gè)server一共分配4*factor個(gè)虛擬節(jié)點(diǎn)

}

// 用MD5來計(jì)算key的hash值

MessageDigest md5 = MD5.get();

md5.reset();

md5.update( key.getBytes() );

byte[] bKey = md5.digest();

// 取MD5值的低32位作為key的hash值

long hv = ((long)(bKey[3]0xFF) 24) | ((long)(bKey[2]0xFF) 16) | ((long)(bKey[1]0xFF) 8 ) | (long)(bKey[0]0xFF);

// hv的tailMap的第一個(gè)虛擬節(jié)點(diǎn)對(duì)應(yīng)的即是目標(biāo)server

SortedMap tmap = this.consistentBuckets.tailMap( hv );

return ( tmap.isEmpty() ) ? this.consistentBuckets.firstKey() : tmap.firstKey();

更多問題到問題求助專區(qū)()

PHP 如何獲取圖片的哈希值啊。。

你好,哈希算法很多,自帶有,sha1函數(shù)跟md5函數(shù),獲取圖片的哈希值要讀取內(nèi)容去運(yùn)算,

如$file=file_get_contents("圖片路徑"); echo sha1($file);//哈希值,echo md5($file);//md5值,這兩個(gè)都是摘要。謝謝

php 如何實(shí)現(xiàn)MD5類型的哈希運(yùn)算?

?

$str="字符串的值,隨便寫";

echo “\$str的md5的值是:”.md5($str);

echo "\$str的sha1的hash值是:".sha1($str);

?

還是給你實(shí)例看吧,新手理解起來可能有點(diǎn)困難 看實(shí)例就簡單了

分享文章:php數(shù)據(jù)庫哈希,php一致性哈希
分享鏈接:http://vcdvsql.cn/article48/hsocep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站用戶體驗(yàn)云服務(wù)器網(wǎng)站內(nèi)鏈網(wǎng)站策劃網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)