0

我有一个具有多个属性的模型MyModel(attr_1:integer, attr_2:string, attr_3:integer, attr_4: float, …etc, uid: integer)

我需要为每条记录的uid字段填充每个唯一值的唯一值attr_1attr_2

然后我可以使用这个字段来查找基于这个组合的所有“半相似”记录和琐碎的选择

第一个想法是:

"#{attr_1}_#{attr_2}".hash #=>produces long (unique?) integer 

但我不确定它是否能提供我需要的价值

是吗?或者您能提出更好的解决方案吗?

4

2 回答 2

0

你可以试试 MD5 哈希算法

require 'digest/md5'
Digest::MD5.hexdigest("#{attr_1}_#{attr_2}")

将为唯一的 attr1_attr2 组合创建唯一的十六进制标识符。

于 2013-09-22T13:51:21.883 回答
0

如果您可以将uid 类型更改为 String,则可以使用以下方法。否则,您将不得不在公钥加密中实现类似的东西。

如果您需要使用唯一键查找半相似的记录,它必须有两个可分离的部分。

hash1 = Digest::MD5.new << 'attr1'
hash2 = Digest::MD5.new << 'attr2'

然后你可以将uid保存为,

hash1[0..6] + "-" + hash2[0..6]

这将创建 13 个字符的字符串(6 + “-” + 6)

然后您可以在搜索中使用它。

例如:如果你想用 attr1x 搜索半相似,在 find 中使用它,

attr1xhash = Digest::MD5.new << 'attr1x'
attr1xhash = attr1xhash[0..6]
"like 'attr1x-%'"

对于 attr2x

attr2xhash = Digest::MD5.new << 'attr2x'
attr2xhash = attr2xhash[0..6]
"like '%-attr2x'"

注意:对于不相等的属性,有可能获得 2 个相等的字符串。您可以通过增加字符串大小来最小化它。(这里有 6 个)

于 2013-09-23T05:54:50.383 回答