Ⅰ 鍝埚笇绠楁硶鍝涓濂斤纻
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的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。