當前位置:首頁 » 操作系統 » c感知哈希演算法

c感知哈希演算法

發布時間: 2024-04-22 20:08:29

Ⅰ 哈希演算法是什麼呢

哈希演算法就是一種特殊的函數,不論輸入多長的一串字元,只要通過這個函數都可以得到一個固定長度的輸出值,這就好像身份證號碼一樣,永遠都是十八位而且全國唯一。哈希演算法的輸出值就叫做哈希值。

原理:

哈希演算法有三個特點,它們賦予了區塊鏈不可篡改、匿名等特性,並保證了整個區塊鏈體系的完整。

第一個特點是具有單向性。比如輸入一串數據,通過哈希演算法可以獲得一個哈希值,但是通過這個哈希值是沒有辦法反推回來得到輸入的那串數據的。這就是單向性,也正是基於這一點,區塊鏈才有效保護了我們信息的安全性。

哈希演算法的第二個特點是抗篡改能力,對於任意一個輸入,哪怕是很小的改動,其哈希值的變化也會非常大。

它的這個特性,在區塊與區塊的連接中就起到了關鍵性的作用。區塊鏈的每個區塊都會以上一個區塊的哈希值作為標示,除非有人能夠破解整條鏈上的所有哈希值,否則數據一旦記錄在鏈上,就不可能進行篡改。

哈希演算法的第三個特點就是抗碰撞能力。所謂碰撞,就是輸入兩個不同的數據,最後得到了一個相同的輸入。

就跟我們逛街時撞衫一樣,而坑碰撞就是大部分的輸入都能得到一個獨一無二的輸出。在區塊鏈的世界中,任何一筆交易或者賬戶的地址都是完全依託於哈希演算法生產的。這也就保證了交易或者賬戶地址在區塊鏈網路中的唯一性。

無論這筆轉賬轉了多少錢,轉給了多少個人,在區塊鏈這個大賬本中都是唯一的存在。它就像人體體內的白細胞,不僅區塊鏈的每個部分都離不開它,而且它還賦予了區塊鏈種種特點,保護著整個區塊鏈體系的安全。

Ⅱ C語言中的hash函數

Hash,一般翻譯做"散列",也有直接音譯為"哈希"的,就是把任意長度的輸入(又叫做預映射, pre-image),通過散列演算法,變換成固定長度的輸出,該輸出就是散列值。這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小於輸入的空間,不同的輸入可能會散列成相同的輸出,而不可能從散列值來唯一的確定輸入值。簡單的說就是一種將任意長度的消息壓縮到某一固定長度的消息摘要的函數。
HASH主要用於信息安全領域中加密演算法,它把一些不同長度的信息轉化成雜亂的128位的編碼里,叫做HASH值. 也可以說,hash就是找到一種數據內容和數據存放地址之間的映射關系。Hash演算法在信息安全方面的應用主要體現在以下的3個方面:文件校驗、數字簽名、鑒權協議
程程序實現
// 說明:Hash函數(即散列函數)在程序設計中的應用目標 ------ 把一個對象通過某種轉換機制對應到一個
//size_t類型(即unsigned long)的整型值。
// 而應用Hash函數的領域主要是 hash表(應用非常廣)、密碼等領域。
// 實現說明:
// ⑴、這里使用了函數對象以及泛型技術,使得對所有類型的對象(關鍵字)都適用。
// ⑵、常用類型有對應的偏特化,比如string、char*、各種整形等。
// ⑶、版本可擴展,如果你對某種類型有特殊的需要,可以在後面實現專門化。
// ⑷、以下實現一般放在頭文件中,任何包含它的都可使用hash函數對象。
//------------------------------------實現------------------------------------------------
#include <string>
using std::string;
inlinesize_thash_str(const char* s)
{
unsigned long res = 0;
for (; *s; ++s)
res = 5 * res + *s;
returnsize_t(res);
}
template <class Key>
struct hash
{
size_toperator () (const Key& k) const;
};
// 一般的對象,比如:vector< queue<string> >;的對象,需要強制轉化
template < class Key >
size_thash<Key>::operator () (const Key& k) const
{
size_tres = 0;
size_tlen = sizeof(Key);
const char* p = reinterpret_cast<const char*>(&k);
while (len--)
{
res = (res<<1)^*p++;
}
return res;
}
// 偏特化
template<>
size_thash< string >::operator () (const string& str) const
{
return hash_str(str.c_str());
}
typedef char* PChar;
template<>
size_thash<PChar>::operator () (const PChar& s) const
{
return hash_str(s);
}
typedef const char* PCChar;
template<>
size_thash<PCChar>::operator () (const PCChar& s) const
{
return hash_str(s);
}
template<> size_t hash<char>::operator () (const char& x) const { return x; }
template<> size_t hash<unsigned char>::operator () (const unsigned char& x) const { return x; }
template<> size_t hash<signed char>::operator () (const signed char& x) const { return x; }
template<> size_t hash<short>::operator () (const short& x) const { return x; }
template<> size_t hash<unsigned short>::operator () (const unsigned short& x) const { return x; }
template<> size_t hash<int>::operator () (const int& x) const { return x; }
template<> size_t hash<unsigned int>::operator () (const unsigned int& x) const { return x; }
template<> size_t hash<long>::operator () (const long& x) const { return x; }
template<> size_t hash<unsigned long>::operator () (const unsigned long& x) const { return x; }
// 使用說明:
//
// ⑴、使用時首先由於是泛型,所以要加上關鍵字類型。
//
// ⑵、其次要有一個函數對象,可以臨時、局部、全局的,只要在作用域就可以。
//
// ⑶、應用函數對象作用於對應類型的對象。
//----------------------- hash函數使用舉例 -------------------------
#include <iostream>
#include <vector>
#include <string>
using namespace std;
int main()
{
vector<string> vstr⑵;
vstr[0] = "sjw";
vstr[1] = "suninf";
hash<string> strhash; // 局部函數對象
cout << " Hash value: " << strhash(vstr[0]) << endl;
cout << " Hash value: " << strhash(vstr[1]) << endl;
cout << " Hash value: " << hash< vector<string> >() (vstr) << endl;
cout << " Hash value: " << hash<int>() (100) << endl; // hash<int>() 臨時函數對象
return 0;
}

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

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演算法是什麼

哈希演算法(Hash 演算法,Hash 算式,散列演算法,消息摘要演算法)將任意長度的二進制值映射為較短的固定長度的二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。

構成哈希演算法的條件:

從哈希值不能反向推導出原始數據(所以哈希演算法也叫單向哈希演算法)。

對輸入數據非常敏感,哪怕原始數據只修改了一個 Bit,最後得到的哈希值也大不相同。

散列沖突的概率要很小,對於不同的原始數據,哈希值相同的概率非常小。

哈希演算法的執行效率要盡量高效,針對較長的文本,也能快速地計算出哈希值。

常見hash演算法的原理

散列表,它是基於快速存取的角度設計的,也是一種典型的「空間換時間」的做法。顧名思義,該數據結構可以理解為一個線性表,但是其中的元素不是緊密排列的,而是可能存在空隙。

散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。

Ⅳ C#灰度圖像通過相似度演算法找出相似度最高的圖片

這種以圖搜圖可以用感知哈希演算法,


第一步 縮小圖片尺寸

將圖片縮小到8x8的尺寸, 總共64個像素. 這一步的作用是去除各種圖片尺寸和圖片比例的差異, 只保留結構、明暗等基本信息.

第二步 轉為灰度圖片

將縮小後的圖片, 轉為64級灰度圖片.

第三步 計算灰度平均值

計算圖片中所有像素的灰度平均值

第四步 比較像素的灰度

將每個像素的灰度與平均值進行比較, 如果大於或等於平均值記為1, 小於平均值記為0.

第五步 計算哈希值

將上一步的比較結果, 組合在一起, 就構成了一個64位的二進制整數, 這就是這張圖片的指紋.

第六步 對比圖片指紋

得到圖片的指紋後, 就可以對比不同的圖片的指紋, 計算出64位中有多少位是不一樣的. 如果不相同的數據位數不超過5, 就說明兩張圖片很相似, 如果大於10, 說明它們是兩張不同的圖片.

具體的c#代碼可以看

usingSystem;
usingSystem.IO;
usingSystem.Drawing;

namespaceSimilarPhoto
{
classSimilarPhoto
{
ImageSourceImg;

publicSimilarPhoto(stringfilePath)
{
SourceImg=Image.FromFile(filePath);
}

publicSimilarPhoto(Streamstream)
{
SourceImg=Image.FromStream(stream);
}

publicStringGetHash()
{
Imageimage=ReceSize();
Byte[]grayValues=ReceColor(image);
Byteaverage=CalcAverage(grayValues);
Stringreslut=ComputeBits(grayValues,average);
returnreslut;
}

//Step1:Recesizeto8*8
privateImageReceSize(intwidth=8,intheight=8)
{
Imageimage=SourceImg.GetThumbnailImage(width,height,()=>{returnfalse;},IntPtr.Zero);
returnimage;
}

//Step2:ReceColor
privateByte[]ReceColor(Imageimage)
{
BitmapbitMap=newBitmap(image);
Byte[]grayValues=newByte[image.Width*image.Height];

for(intx=0;x<image.Width;x++)
for(inty=0;y<image.Height;y++)
{
Colorcolor=bitMap.GetPixel(x,y);
bytegrayValue=(byte)((color.R*30+color.G*59+color.B*11)/100);
grayValues[x*image.Width+y]=grayValue;
}
returngrayValues;
}

//Step3:Averagethecolors
privateByteCalcAverage(byte[]values)
{
intsum=0;
for(inti=0;i<values.Length;i++)
sum+=(int)values[i];
returnConvert.ToByte(sum/values.Length);
}

//Step4:Computethebits
privateStringComputeBits(byte[]values,byteaverageValue)
{
char[]result=newchar[values.Length];
for(inti=0;i<values.Length;i++)
{
if(values[i]<averageValue)
result[i]='0';
else
result[i]='1';
}
returnnewString(result);
}

//Comparehash
(stringa,stringb)
{
if(a.Length!=b.Length)
thrownewArgumentException();
intcount=0;
for(inti=0;i<a.Length;i++)
{
if(a[i]!=b[i])
count++;
}
returncount;
}
}
}

Ⅵ 哈希的演算法是什麼

哈希演算法是一個廣義的演算法,也可以認為是一種思想,使用Hash演算法可以提高存儲空間的利用率,可以提高數據的查詢效率,也可以做數字簽名來保障數據傳遞的安全性。所以Hash演算法被廣泛地應用在互聯網應用中。

哈希演算法也被稱為散列演算法,Hash演算法雖然被稱為演算法,但實際上它更像是一種思想。Hash演算法沒有一個固定的公式,只要符合散列思想的演算法都可以被稱為是Hash演算法。

特點:

加密哈希跟普通哈希的區別就是安全性,一般原則是只要一種哈希演算法出現過碰撞,就會不被推薦成為加密哈希了,只有安全度高的哈希演算法才能用作加密哈希。

同時加密哈希其實也能當普通哈希來用,Git 版本控制工具就是用 SHA-1 這個加密哈希演算法來做完整性校驗的。一般來講越安全的哈希演算法,處理速度也就越慢,所以並不是所有的場合都適合用加密哈希來替代普通哈希。



熱點內容
分卷壓縮包解壓不完整 發布:2024-05-26 06:28:03 瀏覽:529
a連接未訪問 發布:2024-05-26 06:04:25 瀏覽:268
安卓游戲都哪裡下載 發布:2024-05-26 06:04:07 瀏覽:598
浙江機械網路配置有哪些 發布:2024-05-26 05:50:23 瀏覽:394
郵政怎麼修改登錄密碼是什麼 發布:2024-05-26 05:41:00 瀏覽:279
window10無法訪問指定 發布:2024-05-26 05:35:56 瀏覽:469
如何修改鎖頭密碼 發布:2024-05-26 05:30:06 瀏覽:850
本機目前剩餘存儲空間是多少 發布:2024-05-26 05:30:05 瀏覽:812
qt寫數據存儲軟體 發布:2024-05-26 05:20:30 瀏覽:578
資料庫排序規則 發布:2024-05-26 04:49:42 瀏覽:372