当前位置:首页 » 操作系统 » 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-11-27 16:21:01 浏览:89
sql认证培训 发布:2024-11-27 15:53:54 浏览:635
php的异常处理 发布:2024-11-27 15:53:54 浏览:417
电脑设置邮件服务器 发布:2024-11-27 15:53:07 浏览:4
安卓平板叫什么名字 发布:2024-11-27 15:48:12 浏览:172
税盘密码忘了去改需要带什么 发布:2024-11-27 15:41:10 浏览:277
拉筋要加密 发布:2024-11-27 15:38:51 浏览:324
电脑当服务器怎么降低功耗 发布:2024-11-27 15:30:45 浏览:642
苹果手机夸克缓存的视频怎么转为本地视频 发布:2024-11-27 15:24:05 浏览:811
linuxm4 发布:2024-11-27 15:15:12 浏览:322