Sql 我是不是误解了Ruby中的字符串散列?

Sql 我是不是误解了Ruby中的字符串散列?,sql,ruby,string,hash,hashtable,Sql,Ruby,String,Hash,Hashtable,我正在处理一堆数据,但我还没有将重复检查器编码到数据处理器中,所以我预计会出现重复。我运行了以下SQL查询: SELECT body, COUNT(body) AS dup_count FROM comments GROUP BY body HAVING (COUNT(body) > 1) 并得到一份重复的清单。研究这一点,我发现这些副本有多个散列。注释的最短字符串是“[已删除]”。让我们以它为例。在我的数据库中,有九个注释实例是“[已删除]”,在我的

我正在处理一堆数据,但我还没有将重复检查器编码到数据处理器中,所以我预计会出现重复。我运行了以下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故意让
字符串。hash
在不同的会话中产生不同的值:

如果运行

ruby-e“放入”[deleted]'.hash“

有几次,您会注意到值是不同的。事实上,只要Ruby进程处于活动状态,哈希值就保持不变。原因是
String#hash
使用随机值作为种子
rb_str_hash
(C实现函数)使用这个随机种子,它在每次生成Ruby时初始化


您可以使用CRC,例如用于您的目的,或者您可能希望使用
OpenSSL::Digest
的消息摘要之一,尽管后者是多余的,因为对于重复的检测,您可能不需要安全属性。

我使用以下方法来创建跨时间和进程一致的字符串散列替代方法

require 'zlib'

def generate_id(label)
  Zlib.crc32(label.to_s) % (2 ** 30 - 1)
end

我在有“%(2**30-1)”部分和没有“%(2**30-1)”部分的情况下运行了这个程序,得到了相同的结果。想解释一下为什么会有它,以及它的作用吗?我想把我的散列值限制为小于2**30的数字。若将label设置为很长的字符串,那个么应该会看到从generate_id返回的不同值。