基于属性值组合的唯一记录标识符

时间:2013-09-22 13:46:25

标签: ruby-on-rails ruby

我有一个包含多个属性MyModel(attr_1:integer, attr_2:string, attr_3:integer, attr_4: float, …etc, uid: integer)

的模型

我需要为uidattr_1值的每个唯一组合填充每个记录的attr_2字段,并为其添加唯一值

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

第一个想法是:

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

但我不相信它是否能提供我需要的价值

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

2 个答案:

答案 0 :(得分:0)

您可以尝试MD5哈希算法

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

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

答案 1 :(得分:0)

如果您可以将 uid类型更改为String ,则可以使用以下方法。另外,您必须实现类似公钥加密。

的内容

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

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

然后你可以将uid保存为,

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

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

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

例如:如果您想使用attr1x搜索半同类,请在查找中使用它,

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

for attr2x

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

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