sql – 我误解了Ruby中的String #hash吗?
我正在处理一堆数据,我还没有将重复的检查器编码到数据处理器中,所以我预计会发生重复.我运行了以下SQL查询:
SELECT body,COUNT(body) AS dup_count FROM comments GROUP BY body HAVING (COUNT(body) > 1) 并获取重复列表.看着这个,我发现这些重复有多个哈希.评论的最短字符串是“[删除]”.所以让我们以此为例.在我的数据库中,有九个评论实例为“[已删除]”,在我的数据库中,这会生成1169143752200809218和1738115474508091027的哈希值.116次被发现6次,173次被发现3次.但是,当我在IRB中运行它时,我得到以下结果: a = '[deleted]'.hash # => 811866697208321010 这是我用来生成哈希的代码: def comment_and_hash(chunk) comment = chunk.at_xpath('*/span[@class="comment"]').text ##Get Comment## hash = comment.hash return comment,hash end 我已经确认我的代码中的任何其他位置都没有触及评论.这是我的datamapper类. class Comment include DataMapper::Resource property :uid,Serial property :author,String property :date,Date property :body,Text property :arank,Float property :srank,Float property :parent,Integer #Should Be UID of another comment or blank if parent property :value,Integer #Hash to prevent duplicates from occurring end 我是否正确假设字符串上的.hash每次在同一个字符串上调用时都会返回相同的值? 假设我的字符串由“[已删除]”组成,哪个值是正确的值? 有没有办法在ruby中有不同的字符串,但SQL会将它们视为相同的字符串?这似乎是解释为什么会发生这种情况的最合理的解释,但我真的是在黑暗中拍摄. 解决方法如果你跑ruby -e“puts'[删除]’.hash” 好几次,你会注意到价值是不同的.实际上,只要Ruby进程处于活动状态,哈希值就只保持不变.这样做的原因是String #hash以随机值播种. rb_str_hash(C实现函数)使用rb_hash_start,它使用这个随机种子,每次生成Ruby时都会初始化. 您可以使用诸如Zlib#crc32的CRC作为您的目的,或者您可能想要使用OpenSSL :: Digest的消息摘要之一,尽管后者是过度杀伤,因为检测重复项您可能不需要安全属性. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |