JJD*_*JJD 2 ruby sqlite hash uniqueidentifier
我有一个具有不同属性的模型。并非每个实例的每个属性都有一个值。
class Location
attr_accessible :name, # string, default => :null
:size, # integer, default => 0
:latitude, # float, default => 0
:longitude # float, default => 0
# Returns a unique hash for the instance.
def hash
# ...
end
end
Run Code Online (Sandbox Code Playgroud)
如何实现为实例返回唯一 ID 的哈希函数?每次调用对象上的哈希函数时,它应该是相同的。我不想要一个随机的唯一 ID。应该可以在不修改的情况下将哈希存储在 sqlite3 数据库中。
正如您在MetaSkills的回答中所读到的那样,覆盖该hash方法并不是一个好主意,因为它“被大量 ruby 对象用于比较和相等”。因此,我将其重命名为custom_attributes_hash.
require 'digest/md5'
class Location
attr_accessor :name, # string, default => :null
:size, # integer, default => 0
:latitude, # float, default => 0
:longitude # float, default => 0
# Returns a unique hash for the instance.
def hash
Digest::MD5.hexdigest(Marshal::dump(self))
end
end
Run Code Online (Sandbox Code Playgroud)
用撬测试
[1] pry(main)> foo = Location.new;
[2] pry(main)> foo.name = 'foo';
[3] pry(main)> foo.size = 1;
[4] pry(main)> foo.latitude = 12345;
[5] pry(main)> foo.longitude = 54321;
[6] pry(main)>
[7] pry(main)> foo.hash
=> "2044fd3756152f629fb92707cb9441ba"
[8] pry(main)>
[9] pry(main)> foo.size = 2
=> 2
[10] pry(main)> foo.hash
=> "c600666b44eebe72510cc5133d8b4afb"
Run Code Online (Sandbox Code Playgroud)
或者您也可以创建用于序列化属性的自定义函数。例如使用所有的实例变量
def hash
variables = instance_variables.map {|ivar| instance_variable_get(ivar)}.join("|separator|")
Digest::MD5.hexdigest(variables)
end
Run Code Online (Sandbox Code Playgroud)
或选择您需要的
def hash
variables = [name, size].join("|separator|")
Digest::MD5.hexdigest(variables)
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2272 次 |
| 最近记录: |