为了能够检测特定推文的RT,我计划在数据库中存储每个格式化推文的哈希值。
我应该使用什么样的哈希算法。隐秘当然不是必不可少的。只是将数据存储为一种最小化的方式,然后可以以有效的方式对数据进行比较。
我对此的第一次尝试是使用md5哈希。但我认为可以使用更高效的散列算法,因为不需要安全性。
答案 0 :(得分:6)
你真的需要哈希吗? Twitter消息足够短(并且磁盘空间足够便宜),可能更好地存储整个消息,而不是耗费时钟周期来散列它。
答案 1 :(得分:4)
我不熟悉Python(对不起,Ruby家伙在这里打字)但是你可以尝试一些东西。
<强>假设:强> 随着时间的推移,您可能会存储数十万条推文,因此将一个哈希与表中的“每条记录”进行比较将是低效的。此外,RT并不总是原始推文的副本。毕竟,原始作者的名字通常包含在内,占据了140个字符的限制。那么也许您可以使用比“哑”哈希更准确匹配的解决方案?
标记&amp;索引强>
标记和索引组成部分 标准方式的消息。这个 可能包括治疗哈希#.... 标记为@ ....和URL字符串为 “标签”。删除噪音后的话 和标点符号,你也可以 将剩余的单词视为标签 太
快速搜索
数据库发现很糟糕 多个团体成员非常 很快(我会假设你使用它们 Mysql或Postgresql,都是 这很可怕)。而是尝试一个 像自由文本引擎的 Sphinx Search。他们很 解决多个团体成员的速度非常快(即 检查关键字是否存在。)
使用Sphinx或类似产品,我们搜索 我们提取的所有“标签”。这个 可能会返回一个小的 结果集“潜在的原始推文”。然后逐一比较它们 使用相似性匹配算法 (这是Python http://code.google.com/p/pylevenshtein/中的一个)
现在让我热烈欢迎您加入文本挖掘的世界。
祝你好运!答案 2 :(得分:2)
我回应Chris关于根本不使用哈希的评论(您的数据库引擎可以有效地索引140个字符的字段)。
如果你确实想要使用哈希,MD5也是我的第一选择(16字节),接着是SHA-1(20字节)。
无论你做什么,都不要使用字符和。我不能马上想出一个会有更多碰撞的函数(所有的字谜都是相同的),而且速度更慢!
$ python -m timeit -s 'from hashlib import md5' 'd=md5("There once was a man named Michael Finnegan.").digest()'
100000 loops, best of 3: 2.47 usec per loop
$ python -m timeit 'd=sum(ord(c) for c in "There once was a man named Michael Finnegan.")'
100000 loops, best of 3: 13.9 usec per loop
答案 3 :(得分:2)
这里有一些问题。首先,RT并不总是相同的。有些人添加评论。其他人更改了跟踪网址。其他人则认为他们是RT的(可能是也可能不是发起者)。
因此,如果您要对推文进行哈希处理,那么您需要将其归结为推文的内容,并且只是哈希。祝你好运。
上面,有人提到使用32位,您将开始在大约65K的推文上发生冲突。当然,你可能会在推文#2上发生冲突。但我认为该评论的作者很困惑,因为2 ^ 16 = ~65K,但是2 ^ 32 = ~4万亿。所以你在那里有更多的空间。
更好的算法可能是尝试推导推文的“唯一”部分,并对其进行指纹处理。它不是哈希,它是定义唯一性的几个关键词的指纹。
答案 4 :(得分:1)
嗯,推文只有140个字符,所以你甚至可以将整个推文存储在数据库中......
但是如果你真的想以某种方式“哈希”它们,一个简单的方法就是只取两条推文中所有字符的ASCII值之和:
sum(ord(c) for c in tweet)
当然,每当你有一个哈希匹配时,你应该检查推文本身是否相同,因为找到两条提供相同“sum-hash”的推文的概率可能是不可忽视的。
答案 5 :(得分:0)
Python的搁置模块? http://docs.python.org/library/shelve.html
答案 6 :(得分:0)
您正在尝试散列字符串吗?内置类型可以立即进行哈希处理,只需执行hash("some string")
即可获得一些int。它与python用于dictonarys的功能相同,因此它可能是最佳选择。