『壹』 相似圖片檢測:感知哈希演算法之dHash的python實現
某些情況下,我們需要檢測圖片之間的相似性,進行我們需要的處理:刪除同一張圖片、標記盜版等。
如何判斷是同一張圖片呢?最簡單的方法是使用加密哈希(例如MD5, SHA-1)判斷。但是局限性非常大。例如一個txt文檔,其MD5值是根據這個txt的二進制數據計算的,如果是這個txt文檔的完全復製版,那他們的MD5值是完全相同的。但是,一旦改變副本的內容,哪怕只是副本的縮進格式,其MD5也會天差地別。因此加密哈希只能用於判斷兩個完全一致、未經修改的文件,如果是一張經過調色或者縮放的圖片,根本無法判斷其與另一張圖片是否為同一張圖片。
那麼如何判斷一張被PS過的圖片是否與另一張圖片本質上相同呢?比較簡單、易用的解決方案是採用感知哈希演算法(Perceptual Hash Algorithm)。
感知哈希演算法是一類演算法的總稱,包括aHash、pHash、dHash。顧名思義,感知哈希不是以嚴格的方式計算Hash值,而是以更加相對的方式計算哈希值,因為「相似」與否,就是一種相對的判定。
如果我們要計算上圖的dHash值,第一步是把它 縮放到足夠小 。為什麼需要縮放呢?因為原圖的解析度一般都非常高。一張 200*200 的圖片,就有整整4萬個像素點,每一個像素點都保存著一個RGB值,4萬個RGB,是相當龐大的信息量,非常多的細節需要處理。因此,我們需要把圖片縮放到非常小,隱藏它的細節部分,只見森林,不見樹木。建議縮放為9*8,雖然可以縮放為任意大小,但是這個值是相對合理的。而且寬度為9,有利於我們轉換為hash值,往下面看,你就明白了。
(感謝評論區 隔壁萬能的小黑 同學,建議在 image.resize 中加上Image.ANTIALIAS參數,加上此參數將會對所有可以影響輸出像素的輸入像素進行高質量的重采樣濾波)
dHash全名為差異值hash,通過計算相鄰像素之間的顏色強度差異得出。我們縮放後的圖片,細節已經被隱藏,信息量已經變少。但是還不夠,因為它是彩色的,由RGB值組成。白色表示為(255,255,255),黑色表示為(0,0,0),值越大顏色越亮,越小則越暗。每種顏色都由3個數值組成,也就是紅、綠、藍的值 。如果直接使用RGB值對比顏色強度差異,相當復雜,因此我們轉化為灰度值——只由一個0到255的整數表示灰度。這樣的話就將三維的比較簡化為了一維比較。
差異值是通過計算每行相鄰像素的強度對比得出的。我們的圖片為9*8的解析度,那麼就有8行,每行9個像素。差異值是每行分別計算的,也就是第二行的第一個像素不會與第一行的任何像素比較。每一行有9個像素,那麼就會產生8個差異值,這也是為何我們選擇9作為寬度,因為8bit剛好可以組成一個byte,方便轉換為16進制值。
如果前一個像素的顏色強度大於第二個像素,那麼差異值就設置為True(也就是1),如果不大於第二個像素,就設置為False(也就是0)。
我們將差異值數組中每一個值看做一個bit,每8個bit組成為一個16進制值,將16進制值連接起來轉換為字元串,就得出了最後的dHash值。
漢明距離這個概念不止運用於圖片對比領域,也被使用於眾多領域,具體的介紹可以參見Wikipedia。
漢明距離表示將A修改成為B,需要多少個步驟。比如字元串「abc」與「ab3」,漢明距離為1,因為只需要修改「c」為「3」即可。
dHash中的漢明距離是通過計算差異值的修改位數。我們的差異值是用0、1表示的,可以看做二進制。二進制0110與1111的漢明距離為2。
我們將兩張圖片的dHash值轉換為二進制difference,並取異或。計算異或結果的「1」的位數,也就是不相同的位數,這就是漢明距離。
如果傳入的參數不是兩張圖的dHash值,而是直接比較兩張圖片,那麼不需要生成dHash值,直接用Step3中的difference數組,統計不相同的位數,就是漢明距離。
一般來說,漢明距離小於5,基本就是同一張圖片。大家可以根據自己的實際情況,判斷漢明距離臨界值為多少。
https://github.com/hjaurum/DHash
『貳』 哈希表、哈希演算法、一致性哈希表
散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。它通過把關鍵碼映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數(哈希函數),存放記錄的數組叫做散列表。
優點:
哈希表可以提供快速的操作。
缺點:
哈希表通常是基於數組的,數組創建後難於擴展。
也沒有一種簡便的方法可以以任何一種順序〔例如從小到大)遍歷表中的數據項 。
綜上, 如果不需要有序遍歷數據,井且可以提前預測數據量的大小。那麼哈希表在速度和易用性方面是無與倫比的。
1. 使用哈希函數將被查找的鍵轉換為數組的索引。
2. 處理哈希碰撞沖突。
若關鍵字為 k ,則其值存放在 f(k) 的存儲位置上。由此,不需比較便可直接取得所查記錄。稱這個對應關系 f 為散列函數,按這個思想建立的表為散列表。
若對於關鍵字集合中的任一個關鍵字,經散列函數映象到地址集合中任何一個地址的概率是相等的,則稱此類散列函數為 均勻散列函數 (Uniform Hash function),這就是使關鍵字經過散列函數得到一個"隨機的地址",從而減少碰撞。
散列函數能使對一個數據序列的訪問過程更加迅速有效,通過散列函數,數據元素將被更快地定位。
一個好的散列函數一般應該考慮下列因素 :
1.計算簡單,以便提高轉換速度。
2.關鍵詞對應的地址空間分布均勻,以盡量減少沖突。
1. 直接定址法
取關鍵字或者關鍵字的某個線性函數值作為哈希地址,即H(Key)=Key或者H(Key)=a*Key+b(a,b為整數),這種散列函數也叫做自身函數.如果H(Key)的哈希地址上已經有值了,那麼就往下一個位置找,直到找到H(Key)的位置沒有值了就把元素放進去。
2. 數字分析法
數字分析法就是找出數字的規律,盡可能利用這些數據來構造沖突幾率較低的散列地址。
3. 平方取中法
取關鍵字平方後的中間幾位作為散列地址。這種方法的原理是通過取平方擴大差別,平方值的中間幾位和這個數的每一位都相關,則對不同的關鍵字得到的哈希函數值不易產生沖突,由此產生的哈希地址也較為均勻。該方法適用於關鍵字中的每一位都有某些數字重復出現頻度很高的現象。
4. 折疊法
折疊法是將關鍵字分割成位數相同的幾部分,最後一部分位數可以不同,然後取這幾部分的疊加和(注意:疊加和時去除進位)作為散列地址。
數位疊加可以有移位疊加和間界疊加兩種方法。移位疊加是將分割後的每一部分的最低位對齊,然後相加;間界疊加是從一端向另一端沿分割界來回折疊,然後對齊相加。
該方法適用於關鍵字特別多的情況。
5. 隨機數法
選擇一個隨機數,作為散列地址,通常用於關鍵字長度不同的場合。
6. 除留余數法
取關鍵字被某個不大於散列表表長m的數p除後所得的余數為散列地址.即H(Key)=Key MOD p,p<=m.不僅可以對關鍵字直接取模,也可在折疊、平方取中等運算之後取模。對p的選擇很重要,一般取素數或m,若p選得不好,則很容易產生沖突。
對不同的關鍵字可能得到同一散列地址,即 k1≠k2 ,而 f(k1)=f(k2) ,這種現象稱為碰撞(英語:Collision)。具有相同函數值的關鍵字對該散列函數來說稱做同義詞。
通過構造性能良好的散列函數,可以減少沖突,但一般不可能完全避免沖突,因此解決沖突是哈希法的另一個關鍵問題。 創建哈希表和查找哈希表都會遇到沖突,兩種情況下解決沖突的方法應該一致。
下面以創建哈希表為例,說明解決沖突的方法。
1.開放定址法
這種方法也稱再散列法,其基本思想是:當關鍵字key的哈希地址p=H(key)出現沖突時,以p為基礎,產生另一個哈希地址p1,如果p1仍然沖突,再以p為基礎,產生另一個哈希地址p2,…,直到找出一個不沖突的哈希地址pi ,將相應元素存入其中。這種方法有一個通用的再散列函數形式:Hi=(H(key)+di)%m i=1,2,…,m-1,其中H(key)為哈希函數,m 為表長,di稱為增量序列,i為碰撞次數。增量序列的取值方式不同,相應的再散列方式也不同。增量序列主要有以下幾種:
(1) 線性探測再散列
di=1,2,3,…,m-1
這種方法的特點是:沖突發生時,順序查看錶中下一單元,直到找出一個空單元或查遍全表。
(2)二次探測再散列
di=12,-12,22,-22,…,k2,-k2( k<=m/2 )
這種方法的特點是:沖突發生時,在表的左右進行跳躍式探測,比較靈活。
(3)偽隨機探測再散列
di=偽隨機數序列。
線性探測再散列的 優點 是:只要哈希表不滿,就一定能找到一個不沖突的哈希地址,而二次探測再散列和偽隨機探測再散列則不一定。線性探測再散列容易產生「二次聚集」,即在處理同義詞的沖突時又導致非同義詞的沖突。
其實除了上面的幾種方法,開放定址法還有很多變種,不過都是對di有不同的表示方法。(如雙散列探測法:di=i*h2(k))
2.再哈希法
這種方法是同時構造多個不同的哈希函數:Hi=RHi(key),i=1,2,3,…,n。
當哈希地址H1=RH1(key)發生沖突時,再計算H2=RH2(key)……,直到沖突不再產生。這種方法不易產生聚集,但增加了計算時間。
3.鏈地址法(拉鏈法)
這種方法的基本思想是將所有哈希地址相同的元素構成一個稱為同義詞鏈的單鏈表,並將單鏈表的頭指針存在哈希表(數組)中,因而查找、插入和刪除主要在同義詞鏈中進行。若選定的散列表長度為m,則可將散列表定義為一個由m個頭指針組成的指針數組T[0..m-1]。凡是散列地址為i的結點,均插入到以T[i]為頭指針的單鏈表中。T中各分量的初值均應為空指針。鏈地址法適用於經常進行插入和刪除的情況。
拉鏈法的優點
與開放定址法相比,拉鏈法有如下幾個優點:
(1)拉鏈法處理沖突簡單,且無堆積現象,即非同義詞決不會發生沖突,因此平均查找長度較短;
(2)由於拉鏈法中各鏈表上的結點空間是動態申請的,故它更適合於造表前無法確定表長的情況;
(3)開放定址法為減少沖突,要求裝填因子α較小,故當結點規模較大時會浪費很多空間。而拉鏈法中理論上可取α≥1,且結點較大時,拉鏈法中增加的指針域可忽略不計,因此節省空間;(散列表的裝填因子定義為:α= 填入表中的元素個數 / 散列表的長度)
註:HashMap默認裝填因子是0.75。
(4)在用拉鏈法構造的散列表中,刪除結點的操作易於實現。只要簡單地刪去鏈表上相應的結點即可。而對開放定址法構造的散列表,刪除結點不能簡單地將被刪結點的空間置為空,否則將截斷在它之後填入散列表的同義詞結點的查找路徑。這是因為各種開放定址法中,空地址單元都被理解沒有查找到元素。 因此在用開放定址法處理沖突的散列表上執行刪除操作,只能在被刪結點上做刪除標記,而不能真正刪除結點。
拉鏈法的缺點
拉鏈法的缺點是:指針需要額外的空間,故當結點規模較小時,開放定址法較為節省空間,此時將節省的指針空間用來擴大散列表的規模,可使裝填因子變小,這又減少了開放定址法中的沖突,從而提高平均查找速度。
4、建立公共溢出區
這種方法的基本思想是:將哈希表分為基本表和溢出表兩部分,凡是和基本表發生沖突的元素,一律填入溢出表(在這個方法裡面是把元素分開兩個表來存儲)。
散列表的查找過程基本上和造表過程相同。一些關鍵碼可通過散列函數轉換的地址直接找到,另一些關鍵碼在散列函數得到的地址上產生了沖突,需要按處理沖突的方法進行查找。在介紹的三種處理沖突的方法中,產生沖突後的查找仍然是給定值與關鍵碼進行比較的過程。所以,對散列表查找效率的量度,依然用平均查找長度來衡量。
查找過程中,關鍵碼的比較次數,取決於產生沖突的多少,產生的沖突少,查找效率就高,產生的沖突多,查找效率就低。因此,影響產生沖突多少的因素,也就是影響查找效率的因素。
影響產生沖突多少有以下三個因素:
1. 散列函數是否均勻;
2. 處理沖突的方法;
3. 散列表的裝填因子。
散列表的裝填因子
定義為:α= 填入表中的元素個數 / 散列表的長度
α是散列表裝滿程度的標志因子。由於表長是定值,α與"填入表中的元素個數"成正比,所以,α越大,填入表中的元素較多,產生沖突的可能性就越大;α越小,填入表中的元素較少,產生沖突的可能性就越小。
實際上,散列表的平均查找長度是裝填因子α的函數,只是不同處理沖突的方法有不同的函數。
這個HASH演算法不是大學里數據結構課里那個HASH表的演算法。這里的HASH演算法是密碼學的基礎,了解了hash基本定義,就不能不提到一些著名的hash演算法,MD5 和 SHA-1 可以說是目前應用最廣泛的Hash演算法,而它們都是以 MD4 為基礎設計的。
Hash演算法在信息安全方面的應用主要體現在以下的3個方面:
⑴ 文件校驗
我們比較熟悉的校驗演算法有奇偶校驗和CRC校驗,這2種校驗並沒有抗 數據篡改 的能力,它們一定程度上能檢測出數據傳輸中的信道誤碼,但卻不能防止對數據的惡意破壞。
MD5 Hash演算法的"數字指紋"特性,使它成為目前應用最廣泛的一種文件完整性 校驗和 (Checksum)演算法,不少Unix系統有提供計算md5 checksum的命令。
⑵ 數字簽名
Hash 演算法也是現代密碼體系中的一個重要組成部分。由於非對稱演算法的運算速度較慢,所以在 數字簽名 協議中,單向散列函數扮演了一個重要的角色。對 Hash 值,又稱"數字摘要"進行數字簽名,在統計上可以認為與對文件本身進行數字簽名是等效的。而且這樣的協議還有其他的優點。
⑶ 鑒權協議
如下的鑒權協議又被稱作挑戰--認證模式:在傳輸信道是可被偵聽,但不可被篡改的情況下,這是一種簡單而安全的方法。
一致性哈希表簡稱DHT,主要應用於分布式緩存中,可以用來解決分布式存儲結構下動態增加和刪除節點所帶來的問題。比如,一個分布式的存儲系統,要將數據存儲到具體的節點上,如果採用普通的hash方法,將數據映射到具體的節點上,如key%N(key是數據的key,N是機器節點數),如果有一個機器加入或退出這個集群,則所有的數據映射都無效了,如果是持久化存儲則要做數據遷移,如果是分布式緩存,則其他緩存就失效了。
判定哈希演算法好壞的四個定義 :
1、平衡性(Balance):平衡性是指哈希的結果能夠盡可能分布到所有的緩沖中去,這樣可以使得所有的緩沖空間都得到利用。
2、單調性(Monotonicity):單調性是指如果已經有一些內容通過哈希分派到了相應的緩沖中,又有新的緩沖加入到系統中。哈希的結果應能夠保證原有已分配的內容可以被映射到原有的或者新的緩沖中去,而不會被映射到舊的緩沖集合中的其他緩沖區。
3、分散性(Spread):在分布式環境中,終端有可能看不到所有的緩沖,而是只能看到其中的一部分。當終端希望通過哈希過程將內容映射到緩沖上時,由於不同終端所見的緩沖范圍有可能不同,從而導致哈希的結果不一致,最終的結果是相同的內容被不同的終端映射到不同的緩沖區中。這種情況顯然是應該避免的,因為它導致相同內容被存儲到不同緩沖中去,降低了系統存儲的效率。 分散性的定義就是上述情況發生的嚴重程度。好的哈希演算法應能夠盡量避免不一致的情況發生,也就是盡量降低分散性。
4、負載(Load):負載問題實際上是從另一個角度看待分散性問題。既然不同的終端可能將相同的內容映射到不同的緩沖區中,那麼對於一個特定的緩沖區而言,也可能被不同的用戶映射為不同的內容。與分散性一樣,這種情況也是應當避免的, 因此好的哈希演算法應能夠盡量降低緩沖的負荷。
在分布式集群中,對機器的添加刪除,或者機器故障後自動脫離集群這些操作是分布式集群管理最基本的功能。如果採用常用的hash取模演算法,那麼在有機器添加或者刪除後,很多原有的數據就無法找到了,這樣嚴重的違反了單調性原則。接下來主要說明一下一致性哈希演算法是如何設計的。
以SpyMemcached的ketama演算法來說,思路是這樣的:
把數據用hash函數,映射到一個很大的空間里,如圖所示。數據的存儲時,先得到一個hash值,對應到這個環中的每個位置,如k1對應到了圖中所示的位置,然後沿順時針找到一個機器節點B,將k1存儲到B這個節點中。
如果B節點宕機了,則B上的數據就會落到C節點上,如下圖所示:
這樣,只會影響C節點,對其他的節點A,D的數據不會造成影響。然而,這又會造成一個「雪崩」的情況,即C節點由於承擔了B節點的數據,所以C節點的負載會變高,C節點很容易也宕機,這樣依次下去,這樣造成整個集群都掛了。
為此,引入了「虛擬節點」的概念:即把想像在這個環上有很多「虛擬節點」,數據的存儲是沿著環的順時針方向找一個虛擬節點,每個虛擬節點都會關聯到一個真實節點,如下圖所使用:
圖中的A1、A2、B1、B2、C1、C2、D1、D2都是虛擬節點,機器A負載存儲A1、A2的數據,機器B負載存儲B1、B2的數據,機器C負載存儲C1、C2的數據。由於這些虛擬節點數量很多,均勻分布,因此不會造成「雪崩」現象。
『叄』 什麼是hash函數
哈希函數(Hash Function),也稱為散列函數,給定一個輸入 x ,它會算出相應的輸出 H(x) 。哈希函數的主要特徵是:
另外哈希函數一般還要求以下兩種特點:
1、免碰撞 :即不會出現輸入 x≠y ,但是H(x)=H(y) 的情況,其實這個特點在理論上並不成立,比如目前比特幣使用的 SHA256 演算法,會有 2^256 種輸出,如果我們進行 2^256 + 1 次輸入,那麼必然會產生一次碰撞,事實上,通過 理論證明 ,通過 2^130 次輸入就會有99%的可能性發生一次碰撞,不過即使如此,即便是人類製造的所有計算機自宇宙誕生開始一直運算到今天,發生一次碰撞的幾率也是極其微小的。
2、隱匿性 :也就是說,對於一個給定的輸出結果 H(x) ,想要逆推出輸入 x ,在計算上是不可能的。如果想要得到 H(x) 的可能的原輸入,不存在比窮舉更好的方法。
hash 演算法的原理是試圖將一個空間的數據集映射到另外一個空間(通常比原空間要小),並利用質數將數據集能夠均勻的映射。目前主流的 hash 演算法有: md4 、 md5 、 sha系列 。
MD4是麻省理工學院教授 Ronald Rivest 於1990年設計出來的演算法。其摘要長度為128位,一般用32位的十六進制來表示。
2004年8月清華大學教授王小雲,指出在計算MD4時可能發生雜湊沖撞。不久之後,Dobbertin 等人發現了MD4在計算過程中第一步和第三步中的漏洞,並向大家演示了如何利用一部普通電腦在幾分鍾內找到MD4中的沖突,毫無疑問,MD4就此被淘汰掉了。
1991年,Rivest 開發出技術上更為趨近成熟的MD5演算法,它在MD4的基礎上增加了"安全-帶子"(safety-belts)的概念。雖然 MD5 比 MD4 復雜度大一些,但卻更為安全。這個演算法很明顯的由四個和 MD4 設計有少許不同的步驟組成。
MD5 擁有很好的抗修改性,即對原數據進行任何改動,哪怕只修改1個位元組,所得到的MD5值都有很大區別。
MD5很好的用在了大文件的斷點續傳上:如果有一個 5MB 的文件 客戶端把它分割成5片 1MB 的文件 在上傳的時候上傳兩個 MD5 值,一個是當前上傳的文件片的 MD5 還有一個就是拼接之後的 MD5 (如果現在上傳的是第二片 這個MD5就應該是第一片加上第二片的MD5), 通過這樣的方式能保證文件的完整性。
當如果文件傳到一半斷了,伺服器可以通過驗證文件 MD5 值就可以得知用戶已經傳到了第幾片,並且知道之前上傳的文件有沒有發生變化,就可以判斷出用戶需要從第幾片開始傳遞。
不過在2004年8月的國際密碼學會議(Crypto』2004),王小雲提出了一種快速找到 MD5 碰撞的方法(參見其 論文 ),降低了 MD5 的安全性,人們開始尋求更加可靠的加密演算法。
SHA的全稱是Secure Hash Algorithm(安全hash演算法),SHA系列有五個演算法,分別是 SHA-1、SHA-224、SHA-256、SHA-384,和SHA-512,由美國國家安全局(NSA)所設計,並由美國國家標准與技術研究院(NIST)發布,是美國的政府標准。後四者有時並稱為 SHA-2。SHA-1在許多安全協定中廣為使用,包括 TLS/SSL 等,是 MD5 的後繼者。
最初該演算法於1993年發布,稱做安全散列標准 (Secure Hash Standard),最初這個版本被稱為"SHA-0",它在發布之後很快就被NSA撤回,因為有很大的安全缺陷,之後在1995年發布了修訂版本,也就是SHA-1。
SHA-0 和 SHA-1 會從一個最大 2^64 位元的訊息中產生一串 160 位元的摘要,然後以 MD4 及 MD5 演算法類似的原理來加密。
2017年,谷歌發布了最新的研究成功,宣布攻破了SHA-1,並詳細描述了成功的SHA1碰撞攻擊方式,使用這種方式,可以在亞馬遜的雲計算平台上,耗時10天左右創建出SHA-1碰撞,並且成本可以控制在11萬美元以內。
即使如此,對於單台機器來說攻擊的成本依然很高,發生一次SHA-1碰撞需要超過 9,223,372,036,854,775,808 個SHA1計算,這需要使用你的機器進行6500年計算。
SHA2包括了SHA-224、SHA-256、SHA-384,和SHA-512,這幾個函數都將訊息對應到更長的訊息摘要,以它們的摘要長度(以位元計算)加在原名後面來命名,也就是說SHA-256會產生256位長度摘要。
SHA-2相對來說是安全的,至今尚未出現對SHA-2有效的攻擊!
由於目前大量的網站使用的SSL數字證數都是使用SHA-1簽名的,而SHA-1又已經不安全,各大瀏覽器廠商均宣布了棄用SHA-1的時間表:
可以看出,在時間表之後,如果檢測到網站的證書使用的還是SHA-1,就會彈出警告:
為了防止網站因出現上面的警告而顯得不專業,我們需要盡快的申請使用跟安全放心的基於SHA-2簽名的證書。
『肆』 哈希的演算法是什麼
哈希演算法是一個廣義的演算法,也可以認為是一種思想,使用Hash演算法可以提高存儲空間的利用率,可以提高數據的查詢效率,也可以做數字簽名來保障數據傳遞的安全性。所以Hash演算法被廣泛地應用在互聯網應用中。
哈希演算法也被稱為散列演算法,Hash演算法雖然被稱為演算法,但實際上它更像是一種思想。Hash演算法沒有一個固定的公式,只要符合散列思想的演算法都可以被稱為是Hash演算法。
特點:
加密哈希跟普通哈希的區別就是安全性,一般原則是只要一種哈希演算法出現過碰撞,就會不被推薦成為加密哈希了,只有安全度高的哈希演算法才能用作加密哈希。
同時加密哈希其實也能當普通哈希來用,Git 版本控制工具就是用 SHA-1 這個加密哈希演算法來做完整性校驗的。一般來講越安全的哈希演算法,處理速度也就越慢,所以並不是所有的場合都適合用加密哈希來替代普通哈希。
『伍』 用圖片識別搜索引擎(如百度識圖、騰訊優圖)識別個人照片,會不會泄露個人隱私也就是說圖片會不會上傳
會在一定范圍內泄露個人隱私。圖片也會上傳。
原因:圖片識別的基本原理是"感知哈希演算法"(Perceptual hash algorithm),它需要先抓取你的圖片信息,然後根據圖片信息生成一個獨一無二的字元串,然後再去匹配類似接近的字元串。在抓取和匹配的過程中,你的個人信息其實已經上傳。
(5)躲避感知Hash演算法擴展閱讀
圖像識別,是指利用計算機對圖像進行處理、分析和理解,以識別各種不同模式的目標和對象的技術,是應用深度學習演算法的一種實踐應用。
現階段圖像識別技術一般分為人臉識別與商品識別,人臉識別主要運用在安全檢查、身份核驗與移動支付中;商品識別主要運用在商品流通過程中,特別是無人貨架、智能零售櫃等無人零售領域
圖像的傳統識別流程分為四個步驟:圖像採集→圖像預處理→特徵提取→圖像識別。圖像識別軟體國外代表的有康耐視等,國內代表的有圖智能、海深科技等。另外在地理學中指將遙感圖像進行分類的技術。
『陸』 python之哈希演算法
哈希(Hash)演算法:`hash(object)`
哈希演算法將一個不定長的輸入,通過散列函數變換成一個定長的輸出,即散列值。是一種信息摘要演算法。對象的hash值比原對象擁有更低的內存復雜度。
它不同於加密。哈希(hash)是將目標文本轉換成具有相同長度的,不可逆的雜湊字元串,而加密則是將文本轉換為具有相同長度的,可逆的密文。
哈希(hash)演算法是不可逆的,只能由輸入產生輸出,不能由輸出產生輸入。而加密則是可逆的。即可以從輸入產生輸出,也可以反過來從輸出推出輸入。
對於hash演算法,不同的數據應該生成不同的哈希值。如果兩個不同的數據經過Hash函數計算得到的Hash值一樣。就稱為哈希碰撞(collision)。哈希碰撞無法被完全避免。只能降低發生概率。
好的hash函數會導致最少的hash碰撞。
*
可哈希性(hashable):
可哈希的數據類型為不可變的數據結構(如字元串srt,元組tuple,對象集objects等)。這種數據被稱為可哈希性。
不可哈希性:
不可哈希的數據類型,為可變的數據結構(如字典dict,列表list和集合set等)。
如果對可變的對象進行哈希處理,則每次對象更新時,都需要更新哈希表。這樣我們則需要將對象移至不同的數據集,這種操作會使花費過大。
因此設定不能對可變的對象進行hash處理。
**
**
Python3.x添加了hash演算法的隨機性,以提高安全性,因此對於每個新的python調用,同樣的數據源生成的結果都將不同。
哈希方法有(MD5, SHA1, SHA256與SHA512等)。常用的有SH256與SHA512。MD5與SHA1不再常用。
- MDH5 (不常用)
- SHA1 (不常用)
- SHA256 (常用)
- SHA512 (常用)
一種局部敏感的hash演算法,它產生的簽名在一定程度上可以表徵原內容的相似度。
> 可以被用來比較文本的相似度。
安裝simhash:
Pip3 install simhash
感知哈希演算法(perceptual Hash Algorithm)。用於檢測圖像和視頻的差異。
安裝Imagehash:
pip3 install Imagehash
比較下面兩張圖片的Imagehash值
可以看到兩張圖片的hash值非常相似。相似的圖片可以生成相似的哈希值是Imagehash的特點。
『柒』 感知哈希演算法
感知哈希演算法是一類哈希演算法的總稱,其作用在於生成每張圖像的「指紋」(fingerprint)字元串,比較不同圖像的指紋信息來判斷圖像的相似性。結果越接近圖像越相似。感知哈希演算法包括均值哈希(aHash)、感知哈希(pHash)和dHash(差異值哈希)。
aHash速度較快,但精確度較低;pHash則反其道而行之,精確度較高但速度較慢;dHash兼顧二者,精確度較高且速度較快。
在得到64位hash值後,使用漢明距離量化兩張圖像的相似性。漢明距離越大,圖像的相似度越小,漢明距離越小,圖像的相似度越大。
a) 縮放圖片:為了保留圖像的結構,降低圖像的信息量,需要去掉細節、大小和橫縱比的差異,建議把圖片統一縮放到8*8,共64個像素的圖片;
b) 轉化為灰度圖:把縮放後的圖片轉化為256階的灰度圖;
c) 計算平均值: 計算進行灰度處理後圖片的所有像素點的平均值;
d) 比較像素灰度值:遍歷灰度圖片每一個像素,如果大於平均值記錄為1,否則為0;
e) 構造hash值:組合64個bit位生成hash值,順序隨意但前後保持一致性即可;
f) 對比指紋:計算兩幅圖片的指紋,計算漢明距離。
感知哈希演算法可以獲得更精確的結果,它採用的是DCT(離散餘弦變換)來降低頻率。
a) 縮小尺寸
為了簡化了DCT的計算,pHash以小圖片開始(建議圖片大於8x8,32x32)。
b) 簡化色彩
與aHash相同,需要將圖片轉化成灰度圖像,進一步簡化計算量(具體演算法見aHash演算法步驟)。
c) 計算DCT
DCT是把圖片分解頻率聚集和梯狀形。這里以32x32的圖片為例。
d) 縮小DCT
DCT的結果為32x32大小的矩陣,但只需保留左上角的8x8的矩陣,這部分呈現了圖片中的最低頻率。
e) 計算平均值
如同均值哈希一樣,計算DCT的均值
f) 進一步減小DCT
根據8x8的DCT矩陣進行比較,大於等於DCT均值的設為」1」,小於DCT均值的設為「0」。圖片的整體結構保持不變的情況下,hash結果值不變。
g) 構造hash值
組合64個bit位生成hash值,順序隨意但前後保持一致性即可。
h)對比指紋:計算兩幅圖片的指紋,計算漢明距離。
相比pHash,dHash的速度更快,相比aHash,dHash在效率幾乎相同的情況下的效果要更好,它是基於漸變實現的。
a) 縮小圖片:收縮至9*8的大小,它有72的像素點;
b) 轉化為灰度圖:把縮放後的圖片轉化為256階的灰度圖。(具體演算法見aHash演算法步驟);
c) 計算差異值:計算相鄰像素間的差異值,這樣每行9個像素之間產生了8個不同的差異,一共8行,則產生了64個差異值;
d) 比較差異值:如果前一個像素的顏色強度大於第二個像素,那麼差異值就設置為「1」,如果不大於第二個像素,就設置「0」。
e) 構造hash值:組合64個bit位生成hash值,順序隨意但前後保持一致性即可。
f) 對比指紋:計算兩幅圖片的指紋,計算漢明距離。
『捌』 哈希演算法是什麼呢
哈希演算法就是一種特殊的函數,不論輸入多長的一串字元,只要通過這個函數都可以得到一個固定長度的輸出值,這就好像身份證號碼一樣,永遠都是十八位而且全國唯一。
哈希演算法的輸出值就叫做哈希值。哈希演算法也被稱為「散列」,是區塊鏈的四大核心技術之一。是能計算出一個數字消息所對應的、長度固定的字元串。
哈希演算法原理:
Hash演算法的原理是把輸入空間的值映射到Hash空間內,由於Hash值的空間遠小於輸入的空間,而且藉助抽屜原理 ,可以得出一定會存在不同的輸入被映射成相同輸出的情況,如果一個Hash演算法足夠好,那麼他就一定會有更小的發生沖突的概率,也就是說,一個好的Hash演算法應該具有優秀的 抗碰撞能力。