gpt4 book ai didi

ruby - 在 Ruby 中创建数字、字符串、数组或散列的 md5 散列

转载 作者:数据小太阳 更新时间:2023-10-29 06:23:07 25 4
gpt4 key购买 nike

我需要在 Ruby 中为变量创建签名字符串,其中变量可以是数字、字符串、散列或数组。哈希值和数组元素也可以是这些类型中的任何一种。

此字符串将用于比较数据库(在本例中为 Mongo)中的值。

我的第一个想法是创建一个 JSON 编码值的 MD5 散列,如下所示:(body 是上面提到的变量)

def createsig(body)    
Digest::MD5.hexdigest(JSON.generate(body))
end

这几乎可以工作,但是 JSON.generate 不会每次都以相同的顺序对散列的键进行编码,所以 createsig({:a=>'a',:b=>'b'}) 并不总是等于 createsig({:b=>'b',:a=>'a'})

创建满足此需求的签名字符串的最佳方法是什么?

注意:对于我们这些注重细节的人,我知道你不能 JSON.generate() 数字或字符串。在这些情况下,我会直接调用 MD5.hexdigest()

最佳答案

我很快就编写了以下代码,没有时间在工作中真正测试它,但它应该可以完成工作。如果您发现任何问题,请告诉我,我会查看。

这应该正确地展平数组和散列并对其进行排序,并且您需要一些看起来非常奇怪的字符串才能发生任何冲突。

def createsig(body)
Digest::MD5.hexdigest( sigflat body )
end

def sigflat(body)
if body.class == Hash
arr = []
body.each do |key, value|
arr << "#{sigflat key}=>#{sigflat value}"
end
body = arr
end
if body.class == Array
str = ''
body.map! do |value|
sigflat value
end.sort!.each do |value|
str << value
end
end
if body.class != String
body = body.to_s << body.class.to_s
end
body
end

> sigflat({:a => {:b => 'b', :c => 'c'}, :d => 'd'}) == sigflat({:d => 'd', :a => {:c => 'c', :b => 'b'}})
=> true

关于ruby - 在 Ruby 中创建数字、字符串、数组或散列的 md5 散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6461812/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com