1function generateFingerprint() { 2 return new Promise(async (resolve, reject) => { 3 var fingerprint = ''; 4 fingerprint += navigator.userAgent + '|'; 5 fingerprint += screen.width + 'x' + screen.height + '|'; 6 fingerprint += new Date().getTimezoneOffset() + '|'; 7 fingerprint += navigator.language + '|'; 8 fingerprint += navigator.languages + '|'; 9 fingerprint += navigator.globalPrivacyControl + '|'; 10 fingerprint += navigator.serviceWorker + '|'; 11 fingerprint += navigator.cookieEnabled + '|'; 12 fingerprint += navigator.doNotTrack + '|'; 13 if (navigator.plugins && navigator.plugins.length > 0) { 14 for (var i = 0; i < navigator.plugins.length; i++) { 15 fingerprint += navigator.plugins[i].name + ','; 16 } 17 } 18 var res = await generateHash(fingerprint); 19 resolve(res); 20 }); 21} 22 23async function generateHash(str) { 24 return new Promise(async (resolve, reject) => { 25 const encoder = new TextEncoder(); 26 const data = encoder.encode(str); 27 try { 28 const hashBuffer = await crypto.subtle.digest('SHA-1', data); 29 const hashArray = Array.from(new Uint8Array(hashBuffer)); 30 const hashHex = hashArray.map(byte => byte.toString(16).padStart(2, '0')).join(''); 31 resolve(hashHex); 32 } catch (error) { 33 reject(error); 34 } 35 }); 36} 37
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.