導航:首頁 > 源碼編譯 > 哈希演算法標識01是什麼

哈希演算法標識01是什麼

發布時間:2024-08-01 23:38:52

Ⅰ 鍝堝笇綆楁硶鍝涓濂斤紵

C錛屾渶濂介夋嫨錛屼篃灝卞彧鏈変竴涓絳旀堬紝棣栧厛鏄庣『鍝堝笇鍑芥暟鐨勯櫎鐣欎綑娉曠殑P閫夋嫨灝忎簬闀垮害鐨勬渶澶ц川鏁版瘮杈冨ソ錛屾墍浠C璐ㄦ暟涔熷氨鏄緔犳暟錛屽氨鏄闄や簡1鍜屾湰韜涓嶈兘璁╁叾浠栭櫎灝界殑銆

澶勭悊鍐茬獊錛

1.寮鏀懼誨潃娉曪細Hi=(H(key) + di) MOD m,i=1,2錛屸︼紝k(k<=m-1錛夛紝鍏朵腑H(key錛変負鏁e垪鍑芥暟錛宮涓烘暎鍒楄〃闀匡紝di涓哄為噺搴忓垪錛屽彲鏈変笅鍒椾笁縐嶅彇娉曪細

1.1. di=1,2,3錛屸︼紝m-1錛岀О綰挎ф帰嫻嬪啀鏁e垪錛

1.2. di=1^2,-1^2,2^2,-2^2錛屸懚^2錛屸︼紝鹵錛坘)^2,(k<=m/2錛夌О浜屾℃帰嫻嬪啀鏁e垪錛

1.3. di=浼闅忔満鏁板簭鍒楋紝縐頒吉闅忔満鎺㈡祴鍐嶆暎鍒椼

2. 鍐嶆暎鍒楁硶錛欻i=RHi(key),i=1,2錛屸︼紝k RHi鍧囨槸涓嶅悓鐨勬暎鍒楀嚱鏁幫紝鍗沖湪鍚屼箟璇嶄駭鐢熷湴鍧鍐茬獊鏃惰$畻鍙︿竴涓鏁e垪鍑芥暟鍦板潃錛岀洿鍒板啿紿佷笉鍐嶅彂鐢燂紝榪欑嶆柟娉曚笉鏄撲駭鐢熲滆仛闆嗏濓紝浣嗗炲姞浜嗚$畻鏃墮棿銆

3. 閾懼湴鍧娉曪紙鎷夐摼娉曪級

4. 寤虹珛涓涓鍏鍏辨孩鍑哄尯銆

鎵╁睍璧勬枡錛

鏁e垪鍑芥暟鑳戒嬌瀵逛竴涓鏁版嵁搴忓垪鐨勮塊棶榪囩▼鏇村姞榪呴熸湁鏁堬紝閫氳繃鏁e垪鍑芥暟錛屾暟鎹鍏冪礌灝嗚鏇村揩鍦板畾浣嶃

瀹為檯宸ヤ綔涓闇瑙嗕笉鍚岀殑鎯呭喌閲囩敤涓嶅悓鐨勫搱甯屽嚱鏁幫紝閫氬父鑰冭檻鐨勫洜緔犳湁錛

璁$畻鍝堝笇鍑芥暟鎵闇鏃墮棿

鍏抽敭瀛楃殑闀垮害

鍝堝笇琛ㄧ殑澶у皬

鍏抽敭瀛楃殑鍒嗗竷鎯呭喌

璁板綍鐨勬煡鎵鵑戠巼

1銆佺洿鎺ュ誨潃娉曪細鍙栧叧閿瀛楁垨鍏抽敭瀛楃殑鏌愪釜綰挎у嚱鏁板間負鏁e垪鍦板潃銆傚嵆H(key)=key鎴朒(key) = a路key + b錛屽叾涓璦鍜宐涓哄父鏁幫紙榪欑嶆暎鍒楀嚱鏁板彨鍋氳嚜韜鍑芥暟錛夈傝嫢鍏朵腑H(key錛変腑宸茬粡鏈夊間簡錛屽氨寰涓嬩竴涓鎵撅紝鐩村埌H(key錛変腑娌℃湁鍊間簡錛屽氨鏀捐繘鍘匯

2銆佹暟瀛楀垎鏋愭硶錛氬垎鏋愪竴緇勬暟鎹錛屾瘮濡備竴緇勫憳宸ョ殑鍑虹敓騫存湀鏃ワ紝榪欐椂鎴戜滑鍙戠幇鍑虹敓騫存湀鏃ョ殑鍓嶅嚑浣嶆暟瀛楀ぇ浣撶浉鍚岋紝榪欐牱鐨勮瘽錛屽嚭鐜板啿紿佺殑鍑犵巼灝變細寰堝ぇ銆

浣嗘槸鎴戜滑鍙戠幇騫存湀鏃ョ殑鍚庡嚑浣嶈〃紺烘湀浠藉拰鍏蜂綋鏃ユ湡鐨勬暟瀛楀樊鍒寰堝ぇ錛屽傛灉鐢ㄥ悗闈㈢殑鏁板瓧鏉ユ瀯鎴愭暎鍒楀湴鍧錛屽垯鍐茬獊鐨勫嚑鐜囦細鏄庢樉闄嶄綆銆傚洜姝ゆ暟瀛楀垎鏋愭硶灝辨槸鎵懼嚭鏁板瓧鐨勮勫緥錛屽敖鍙鑳藉埄鐢ㄨ繖浜涙暟鎹鏉ユ瀯閫犲啿紿佸嚑鐜囪緝浣庣殑鏁e垪鍦板潃銆

3銆佸鉤鏂瑰彇涓娉曪細褰撴棤娉曠『瀹氬叧閿瀛椾腑鍝鍑犱綅鍒嗗竷杈冨潎鍖鏃訛紝鍙浠ュ厛奼傚嚭鍏抽敭瀛楃殑騫蟲柟鍊礆紝鐒跺悗鎸夐渶瑕佸彇騫蟲柟鍊肩殑涓闂村嚑浣嶄綔涓哄搱甯屽湴鍧銆傝繖鏄鍥犱負錛氬鉤鏂瑰悗涓闂村嚑浣嶅拰鍏抽敭瀛椾腑姣忎竴浣嶉兘鐩稿叧錛屾晠涓嶅悓鍏抽敭瀛椾細浠ヨ緝楂樼殑姒傜巼浜х敓涓嶅悓鐨勫搱甯屽湴鍧銆

渚嬶細鎴戜滑鎶婅嫳鏂囧瓧姣嶅湪瀛楁瘝琛ㄤ腑鐨勪綅緗搴忓彿浣滀負璇ヨ嫳鏂囧瓧姣嶇殑鍐呴儴緙栫爜銆備緥濡侹鐨勫唴閮ㄧ紪鐮佷負11錛孍鐨勫唴閮ㄧ紪鐮佷負05錛孻鐨勫唴閮ㄧ紪鐮佷負25錛孉鐨勫唴閮ㄧ紪鐮佷負01, B鐨勫唴閮ㄧ紪鐮佷負02銆傜敱姝ょ粍鎴愬叧閿瀛椻淜EYA鈥濈殑鍐呴儴浠g爜涓11052501錛屽悓鐞嗘垜浠鍙浠ュ緱鍒板叧

瀛椻淜YAB鈥濄佲淎KEY鈥濄佲淏KEY鈥濈殑鍐呴儴緙栫爜銆備箣鍚庡瑰叧閿瀛楄繘琛屽鉤鏂硅繍綆楀悗錛屽彇鍑虹7鍒扮9浣嶄綔涓鴻ュ叧閿瀛楀搱甯屽湴鍧銆

鍙傝冭祫鏂欐潵婧愶細鐧懼害鐧劇-鏁e垪琛

Ⅱ 什麼是哈希hash 演算法

*nix系系統:
ES(Unix)
例子: IvS7aeT4NzQPM
說明:linux或者其他linux內核系統中
長度: 13 個字元
描述:第1、2位為salt,例子中的'Iv'位salt,後面的為hash值
系統:MD5(Unix)
例子:$1$12345678$XM4P3PrKBgKNnTaqG9P0T/
說明:Linux或者其他linux內核系統中
長度:34個字元
描述:開始的$1$位為加密標志,後面8位12345678為加密使用的salt,後面的為hash
加密演算法:2000次循環調用MD5加密
系統:SHA-512(Unix)
例子:$6$12345678$U6Yv5E1lWn6mEESzKen42o6rbEm
說明:Linux或者其他linux內核系統中
長度: 13 個字元
描述:開始的$6$位為加密標志,後面8位為salt,後面的為hash
加密演算法:5000次的SHA-512加密
系統:SHA-256(Unix)
例子:$5$12345678$jBWLgeYZbSvREnuBr5s3gp13vqi
說明:Linux或者其他linux內核系統中
長度: 55 個字元
描述:開始的$5$位為加密標志,後面8位為salt,後面的為hash
加密演算法:5000次的SHA-256加密
系統:MD5(APR)
例子:$apr1$12345678$auQSX8Mvzt.tdBi4y6Xgj.
說明:Linux或者其他linux內核系統中
長度:37個字元
描述:開始的$apr1$位為加密標志,後面8位為salt,後面的為hash
加密演算法:2000次循環調用MD5加密
windows系統:
windows
例子:Admin:
長度:98個字元
加密演算法:MD4(MD4(Unicode($pass)).Unicode(strtolower($username)))
mysql
系統:mysql
例子:606717496665bcba
說明:老版本的MySql中
長度:8位元組(16個字元)
說明:包括兩個位元組,且每個字的值不超過0x7fffffff
系統:MySQL5
例子:*
說明:較新版本的MySQL
長度:20位元組(40位)
加密演算法:SHA-1(SHA-1($pass))
其他系統:
系統:MD5(WordPress)
例子:$P$
說明:WordPress使用的md5
長度:34個字元
描述:$P$表示加密類型,然後跟著一位字元,經常是字元『B』,後面是8位salt,後面是就是hash
加密演算法:8192次md5循環加密

系統:MD5(phpBB3)
說明:phpBB 3.x.x.使用
例子:$H$9123456785DAERgALpsri.D9z3ht120
長度:34個字元
描述:開始的$H$為加密標志,後面跟著一個字元,一般的都是字元『9』,然後是8位salt,然後是hash 值
加密演算法:2048次循環調用MD5加密
系統:RAdmin v2.x
說明:Remote Administrator v2.x版本中
例子:
長度:16位元組(32個字元)
加密演算法:字元用0填充到100位元組後,將填充過後的字元經過md5加密得到(32位值)
md5加密
標准MD5
例子:
使用范圍:phpBB v2.x, Joomla 的 1.0.13版本前,及其他cmd
長度:16個字元
其他的加salt及變形類似:
md5($salt.$pass)
例子::12
md5(md5($pass))
例子:
md5(md5($pass).$salt)
例子::wQ6
md5(md5($salt).md5($pass))
例子: :wH6_S
md5(md5($salt).$pass)
例子: :1234

Ⅲ 圖片相似度判斷

1. https://zhuanlan.hu.com/p/68215900
為了得到兩張相似的圖片,在這里通過以下幾種簡單的計算方式來計算圖片的相似度:
直方圖計算圖片的相似度
通過哈希值,漢明距離計算
通過圖片的餘弦距離計算
通過圖片結構度量計算

二、哈希演算法計算圖片的相似度
圖像指紋:

圖像指紋和人的指紋一樣,是身份的象徵,而圖像指紋簡單點來講,就是將圖像按照一定的哈希演算法,經過運算後得出的一組二進制數字。

漢明距離:

假如一組二進制數據為101,另外一組為111,那麼顯然把第一組的第二位數據0改成1就可以變成第二組數據111,所以兩組數據的漢明距離就為1。簡單點說,漢明距離就是一組二進制數據變成另一組數據所需的步驟數,顯然,這個數值可以衡量兩張圖片的差異,漢明距離越小,則代表相似度越高。漢明距離為0,即代表兩張圖片完全一樣。

感知哈希演算法是一類演算法的總稱,包括aHash、pHash、dHash。顧名思義,感知哈希不是以嚴格的方式計算Hash值,而是以更加相對的方式計算哈希值,因為「相似」與否,就是一種相對的判定。

幾種hash值的比較:

aHash:平均值哈希。速度比較快,但是常常不太精確。
pHash:感知哈希。精確度比較高,但是速度方面較差一些。
dHash:差異值哈希。精確度較高,且速度也非常快

該演算法是基於比較灰度圖每個像素與平均值來實現。

aHash的hanming距離步驟:

先將圖片壓縮成8*8的小圖
將圖片轉化為灰度圖
計算圖片的Hash值,這里的hash值是64位,或者是32位01字元串
將上面的hash值轉換為16位的
通過hash值來計算漢明距離

def ahash(image):
# 將圖片縮放為8*8的
image = cv2.resize(image, (8, 8), interpolation=cv2.INTER_CUBIC)
# 將圖片轉化為灰度圖
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
# s為像素和初始灰度值,hash_str為哈希值初始值
s = 0
# 遍歷像素累加和
for i in range(8):
for j in range(8):
s = s + gray[i, j]
# 計算像素平均值
avg = s / 64
# 灰度大於平均值為1相反為0,得到圖片的平均哈希值,此時得到的hash值為64位的01字元串
ahash_str = ''
for i in range(8):
for j in range(8):
if gray[i, j] > avg:
ahash_str = ahash_str + '1'
else:
ahash_str = ahash_str + '0'
result = ''
for i in range(0, 64, 4):
result += ''.join('%x' % int(ahash_str[i: i + 4], 2))
# print("ahash值:",result)
return result
2.感知哈希演算法(pHash):

均值哈希雖然簡單,但是受均值影響大。如果對圖像進行伽馬校正或者進行直方圖均值化都會影響均值,從而影響哈希值的計算。所以就有人提出更健壯的方法,通過離散餘弦(DCT)進行低頻提取。

離散餘弦變換(DCT)是種圖像壓縮演算法,它將圖像從像素域變換到頻率域。然後一般圖像都存在很多冗餘和相關性的,所以轉換到頻率域之後,只有很少的一部分頻率分量的系數才不為0,大部分系數都為0(或者說接近於0)。Phash哈希演算法過於嚴格,不夠精確,更適合搜索縮略圖,為了獲得更精確的結果可以選擇感知哈希演算法,它採用的是DCT(離散餘弦變換)來降低頻率的方法。

pHash的hanming距離步驟:

縮小圖片:32 * 32是一個較好的大小,這樣方便DCT計算轉化為灰度圖
計算DCT:利用Opencv中提供的dct()方法,注意輸入的圖像必須是32位浮點型,所以先利用numpy中的float32進行轉換
縮小DCT:DCT計算後的矩陣是32 * 32,保留左上角的8 * 8,這些代表的圖片的最低頻率
計算平均值:計算縮小DCT後的所有像素點的平均值。
進一步減小DCT:大於平均值記錄為1,反之記錄為0.
得到信息指紋:組合64個信息位,順序隨意保持一致性。
最後比對兩張圖片的指紋,獲得漢明距離即可。

def phash(path):
# 載入並調整圖片為32*32的灰度圖片
img = cv2.imread(path)
img1 = cv2.resize(img, (32, 32),cv2.COLOR_RGB2GRAY)

# 創建二維列表
h, w = img.shape[:2]
vis0 = np.zeros((h, w), np.float32)
vis0[:h, :w] = img1

# DCT二維變換
# 離散餘弦變換,得到dct系數矩陣
img_dct = cv2.dct(cv2.dct(vis0))
img_dct.resize(8,8)
# 把list變成一維list
img_list = np.array().flatten(img_dct.tolist())
# 計算均值
img_mean = cv2.mean(img_list)
avg_list = ['0' if i<img_mean else '1' for i in img_list]
return ''.join(['%x' % int(''.join(avg_list[x:x+4]),2) for x in range(0,64,4)])

相比pHash,dHash的速度要快的多,相比aHash,dHash在效率幾乎相同的情況下的效果要更好,它是基於漸變實現的。

dHash的hanming距離步驟:

先將圖片壓縮成9*8的小圖,有72個像素點
將圖片轉化為灰度圖
計算差異值:dHash演算法工作在相鄰像素之間,這樣每行9個像素之間產生了8個不同的差異,一共8行,則產生了64個差異值,或者是32位01字元串。
獲得指紋:如果左邊的像素比右邊的更亮,則記錄為1,否則為0.
通過hash值來計算漢明距離

def dhash(image):
# 將圖片轉化為8*8
image = cv2.resize(image, (9, 8), interpolation=cv2.INTER_CUBIC)
# 將圖片轉化為灰度圖
gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
dhash_str = ''
for i in range(8):
for j in range(8):
if gray[i, j] > gray[i, j + 1]:
dhash_str = dhash_str + '1'
else:
dhash_str = dhash_str + '0'
result = ''
for i in range(0, 64, 4):
result += ''.join('%x' % int(dhash_str[i: i + 4], 2))
# print("dhash值",result)
return result

def campHash(hash1, hash2):
n = 0
# hash長度不同返回-1,此時不能比較
if len(hash1) != len(hash2):
return -1
# 如果hash長度相同遍歷長度
for i in range(len(hash1)):
if hash1[i] != hash2[i]:
n = n + 1
return n

Ⅳ MD5,sha1,sha256分別輸出多少位啊

MD5輸出128位、SHA1輸出160位、SHA256輸出256位。

1、MD5消息摘要演算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的密碼散列函數,可以產生出一個128位(16位元組)的散列值(hash value),用於確保信息傳輸完整一致。

2、SHA1安全哈希演算法(Secure Hash Algorithm)主要適用於數字簽名標准 裡面定義的數字簽名演算法。對於長度小於2^64位的消息,SHA1會產生一個160位的消息摘要。

3、sha256哈希值用作表示大量數據的固定大小的唯一值。數據的少量更改會在哈希值中產生不可預知的大量更改。SHA256 演算法的哈希值大小為 256 位。

(4)哈希演算法標識01是什麼擴展閱讀:

MD5應用:

1、一致性驗證

MD5的典型應用是對一段信息產生信息摘要,以防止被篡改。具體來說文件的MD5值就像是這個文件的「數字指紋」。每個文件的MD5值是不同的,如果任何人對文件做了任何改動,其MD5值也就是對應的「數字指紋」就會發生變化。

比如下載伺服器針對一個文件預先提供一個MD5值,用戶下載完該文件後,用我這個演算法重新計算下載文件的MD5值,通過比較這兩個值是否相同,就能判斷下載的文件是否出錯,或者說下載的文件是否被篡改了。

2、數字簽名

MD5的典型應用是對一段Message(位元組串)產生fingerprint(指紋),以防止被「篡改」。

例子:將一段話寫在一個叫 readme.txt文件中,並對這個readme.txt產生一個MD5的值並記錄在案,然後可以傳播這個文件給,如果修改了文件中的任何內容,你對這個文件重新計算MD5時就會發現(兩個MD5值不相同)。

如果再有一個第三方的認證機構,用MD5還可以防止文件作者的「抵賴」,這就是所謂的數字簽名應用。

3、安全訪問認證

MD5還廣泛用於操作系統的登陸認證上,如Unix、各類BSD系統登錄密碼、數字簽名等諸多方面。如在Unix系統中用戶的密碼是以MD5(或其它類似的演算法)經Hash運算後存儲在文件系統中。

當用戶登錄的時候,系統把用戶輸入的密碼進行MD5 Hash運算,然後再去和保存在文件系統中的MD5值進行比較,進而確定輸入的密碼是否正確。

即使暴露源程序和演算法描述,也無法將一個MD5的值變換回原始的字元串,從數學原理上說,是因為原始的字元串有無窮多個,這有點象不存在反函數的數學函數。

閱讀全文

與哈希演算法標識01是什麼相關的資料

熱點內容
java的聖經 瀏覽:36
python遍歷兩個數組 瀏覽:393
手游搭建雲伺服器 瀏覽:401
視易鋒雲伺服器啟動黑屏 瀏覽:139
python怎麼獲取網頁a標簽內容 瀏覽:982
app更新後老的安裝包去哪裡了 瀏覽:199
集合運演算法則差集 瀏覽:310
x2pdf 瀏覽:271
python源碼cs 瀏覽:101
數控機床自動編程軟體 瀏覽:738
方舟的伺服器號是什麼 瀏覽:111
沒有伺服器怎麼發現其他節點 瀏覽:337
文明傳奇怎麼開伺服器 瀏覽:56
javalistint 瀏覽:675
程序員到公司當領導 瀏覽:225
用演算法控制玩家的行為 瀏覽:484
androidsdk17下載 瀏覽:793
怎麼給單獨表格添加密碼 瀏覽:14
下載壓縮密碼 瀏覽:260
android系統上編程 瀏覽:470