-
Notifications
You must be signed in to change notification settings - Fork 8
Description
这里我借用了https://github.com/zR00t1/iconhash的第三方库,然后实现对网站icon进行hash编码
第三方库:
var MurmurHash3={mul32:function(m,n){var nlo=n&0xffff;var nhi=n-nlo;return((nhi*m|0)+(nlo*m|0))|0;},hashBytes:function(data,len,seed){var c1=0xcc9e2d51,c2=0x1b873593;var h1=seed;var roundedEnd=len&~0x3;for(var i=0;i<roundedEnd;i+=4){var k1=(data.charCodeAt(i)&0xff)|((data.charCodeAt(i+1)&0xff)<<8)|((data.charCodeAt(i+2)&0xff)<<16)|((data.charCodeAt(i+3)&0xff)<<24);k1=this.mul32(k1,c1);k1=((k1&0x1ffff)<<15)|(k1>>>17);k1=this.mul32(k1,c2);h1^=k1;h1=((h1&0x7ffff)<<13)|(h1>>>19);h1=(h1*5+0xe6546b64)|0;}k1=0;switch(len%4){case 3:k1=(data.charCodeAt(roundedEnd+2)&0xff)<<16;case 2:k1|=(data.charCodeAt(roundedEnd+1)&0xff)<<8;case 1:k1|=(data.charCodeAt(roundedEnd)&0xff);k1=this.mul32(k1,c1);k1=((k1&0x1ffff)<<15)|(k1>>>17);k1=this.mul32(k1,c2);h1^=k1;}h1^=len;h1^=h1>>>16;h1=this.mul32(h1,0x85ebca6b);h1^=h1>>>13;h1=this.mul32(h1,0xc2b2ae35);h1^=h1>>>16;return h1;},};if(typeof module!=="undefined"&&typeof module.exports!=="undefined"){module.exports=MurmurHash3;}
content.js文件中的getFaviconHash()函数实现:
`async function getFaviconHash() {
try {
// 获取favicon的URL
let faviconUrl = '';
const faviconElement = document.querySelector('link[rel="icon"], link[rel="shortcut icon"]');
if (faviconElement) {
faviconUrl = faviconElement.href;
} else {
// 如果没有找到favicon标签,使用默认路径
faviconUrl = new URL('/favicon.ico', window.location.origin).href;
}
// 获取favicon的内容
const response = await fetch(faviconUrl);
const blob = await response.blob();
// 转换为base64
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.onload = function(e) {
try {
// 移除base64前缀(data:image/xxx;base64,)
const base64String = e.target.result.split(',')[1];
// 每76个字符插入换行符
const formattedBase64 = base64String.replace(/.{76}/g, '$&\n') + '\n';
// 计算hash
const hash = MurmurHash3.hashBytes(formattedBase64, formattedBase64.length, 0);
resolve(hash.toString());
console.log('Favicon Hash:', hash.toString());
} catch (error) {
reject(error);
}
};
reader.onerror = reject;
reader.readAsDataURL(blob);
});
} catch (error) {
console.error('获取favicon hash失败:', error);
return null;
}
}`


