识别跨页面加载的元素

时间:2012-05-25 08:17:41

标签: javascript hash

我不是这个问题的确定标题是最好的,但希望这个解释能很好地说明我想要做什么。现在是早上4点,所以我将原谅和混淆传递给你。

基本上我想要做的是确定用户选择的元素是否会再次显示在网站的任何页面上。这用于实现“不再显示我”的通知,而无需在服务器端维护一个巨大的数据库,用户隐藏了哪些通知,并且还允许创建动态生成的通知。

手动通知每个通知都会产生动态通知,因此需要动态解决方案。

我的想法是生成通知的哈希值,使用简单的方法将通知文本转换为整齐的小哈希,可以有效地存储在localStorage中,而不会占用大量内存使用了大量通知(或者如果这些通知包含大量文本)。

显然,像MD5和SHA-1这样的东西是直接候选者,因为它们被广泛使用,并且JavaScript中有许多示例实现来弥补这些函数不是本机的事实。

但他们对我来说似乎有些过分。我见过的每个实现都定义了至少十几个辅助函数来完成工作,我不喜欢使用我不理解的代码。此外,我不需要加密强度,我只需要快速简单的哈希。

我想出了以下内容:

function hash(str) {
    var l = str.length, i, out = 0;
    for( i=0; i<l; i++) out = (out<<1)^str.charCodeAt(i);
    return out;
}

经过一些测试后,这似乎产生了相当不错的哈希值。它显然是一致的:相同的输入将产生相同的输出。

我真正想知道的是:这是一个可用的哈希函数吗?我的意思是,通过使用这个哈希函数,我是否有很高的冲突风险?


在指出<<不旋转,只是移位并丢弃溢出之后,该函数现在是:

function hash(str) {
    var l = str.length, i, out = 0;
    for( i=0; i<l; i++) out = ((out<<1)|(out&0x80000000?1:0))^str.charCodeAt(i);
    return out;
}

这基本上实现了位旋转,因为我认为没有内置运算符。

1 个答案:

答案 0 :(得分:1)

我测试了一些样本并且它看起来不是很好,因为具有相同结尾的超过32个字符的字符串会产生相同的结果。

console.log(hash('Hello world. Lorem ipsum dolor sit amet, consectetur adipiscing elit.'));
console.log(hash('Something entirely different. Lorem ipsum dolor sit amet, consectetur adipiscing elit.'));

对我来说,这两种情况都会产生721528210

我认为这是因为你通过用&lt;&lt;来移动它们来继续销毁字节,而同时,XOR ^是成对的。任何字母都会改变当前的32个字节,但这些字母将在32个字符后被销毁。