sql - 我误解了 Ruby 中的 String#hash 吗?

标签 sql ruby string hash hashtable

我正在处理一堆数据,但我还没有将重复检查器编码到数据处理器中,所以我预计会出现重复。我运行了以下 SQL 查询:

SELECT     body, COUNT(body) AS dup_count 
FROM         comments
GROUP BY body
HAVING     (COUNT(body) > 1) 

然后返回一个重复的列表。对此进行调查,我发现这些重复项具有多个哈希值。最短的评论字符串是[deleted]"。因此,让我们以此为例。在我的数据库中,有九个评论实例是 [deleted]",在我的数据库中,这会产生 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

我已经确认我没有在我的代码中的任何其他地方触及评论。这是我的数据映射器类。

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 每次在同一个字符串上被调用时都会返回相同的值?

假设我的字符串由 [deleted]" 组成,哪个值是正确的值?

有没有办法让我在 ruby​​ 中有不同的字符串,但 SQL 会将它们视为相同的字符串?对于为什么会发生这种情况,这似乎是最合理的解释,但我真的是在摸黑。

最佳答案

如果你跑

ruby -e "puts '[deleted]'.hash"

几次,你会发现值不一样了。事实上,只要您的 Ruby 进程处于事件状态,哈希值就会保持不变。这样做的原因是 String#hash 被植入了一个随机值。 rb_str_hash(C实现函数)使用rb_hash_start它使用每次生成 Ruby 时都会初始化的随机种子。

您可以使用 CRC,例如 Zlib#crc32出于您的目的,或者您可能想要使用 OpenSSL::Digest 的消息摘要之一,尽管后者有点矫枉过正,因为检测重复项可能不需要安全属性。

关于sql - 我误解了 Ruby 中的 String#hash 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7734471/

相关文章:

mysql - 如何使用 MySQL 在两列中填充名称?

sql - jsonb_array_elements 获取元素位置

ruby-on-rails - 为什么我在 structure.sql 中看到 `SET xmloption = content;`?

ruby - 使用 linkedin ruby​​ gem 的 OAuth 问题

ruby-on-rails - 如何在 rails 中添加单个自定义路由?

c - 在 C 中的嵌套循环中使用 strtok() 吗?

mysql - 如果有两个相同,如何在 SQL 中找到最小值?

mysql - 使用条件语句选择

string - 如何将字符串转换为R中的数学表达式?

javascript - 在javascript中将列表中的单词与句子中的单词相匹配的最佳方法是什么?