ruby - 在 Ruby 中将唯一的种子字符串转换为随机但确定的浮点值

标签 ruby string floating-point md5 sha

我在概念上遇到了困难。

基本上,我需要接受一些任意的唯一字符串,并能够将其转换为规范化的浮点值。输出浮点值是什么并不重要,只要相同的字符串输入总是产生相同的规范化浮点输出即可。

所以这是一个哈希算法,对吗?我熟悉 SHA1 或 MD5,这似乎类似于密码散列,正确密码的结果相同。但是我相信那些方法会输出字符串。我没有得到的是如何将 SHA1 或 MD5 的结果转换为一致的浮点值。

# Goal
def string_to_float(seed_string)
  # ...
end

string_to_float('abc-123') #=> 0.15789
string_to_float('abc-123') #=> 0.15789

string_to_float('def-456') #=> 0.57654
string_to_float('def-456') #=> 0.57654

那么我可以在 Ruby 中采用哪种方法将任意字符串转换为随机但一致的浮点值?

最佳答案

您想要的关键部分是一种将 SHA1 或 MD5 哈希输出转换为既确定又 1-1 的 float 的方法。这是一个基于 md5 的简单解决方案。这也可以用作整数。

require 'digest/md5'

class String
  def float_hash
    (Digest::MD5.hexdigest(self).to_i(16)).to_f
  end
end

puts "example_string".float_hash  # returns 1.3084281619666243e+38

这会生成一个十六进制哈希值,然后将其转换为整数,然后再将其转换为 float 。每一步都是确定性的。

注意:正如@emboss 所指出的,这会降低抗碰撞性,因为 double 为 8 个字节,而哈希为 16 个字节。尽管从您的应用程序的声音来看,这应该不是什么大问题。

关于ruby - 在 Ruby 中将唯一的种子字符串转换为随机但确定的浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7112664/

相关文章:

ruby-on-rails - 如何在 Ruby on Rails 中构建一个查询,该查询仅加入一个 has_many 关系的最大值并在该关系上包含一个选择过滤器?

c - 如何在 C 中将 char *string 复制到 char c[]?

c++ - IEEE Std 754 Floating-Point : let t := a - b, 标准是否保证 a == b + t?

c++ - Haskell 将 (0/0) 设置为 qnan

ruby - 在 Ruby 中发出 HEAD 请求

ruby-on-rails - 上传图片 Ruby on Rails

Char 指针 NULL 终止和内存分配

Javascript - 非结构化 URL 的 URL 解码

c# - 往返格式说明符 "R"的 64 位与 32 位双重解析问题

php - Ruby SSO、CAS、oauth、用户存储。我有什么选择?