如何在JavaScript中计算ruby哈希?
我有一个用例来发送负载的哈希码以及请求中的负载。
我的客户端是 Ruby,但服务器是 Rails 和 Node。
为有效负载(任何 Ruby HashMap)创建哈希码的最佳方法是什么?
如何在另一台服务器上创建相同的哈希码?
>> x = {:name=>"John", :age=>30, :cars=>{:car1=>"Ford", :car2=>"BMW", :car3=>"Fiat"}}
>> x.hash
-4250725627701565010
回答
这不可能。
Ruby 对哈希码做出的唯一保证是:
eql?具有相同哈希码的两个对象。- 对象的哈希码不会改变,除非它发生变异。
- 哈希码是一个
Integer. 在某些方法中,它可能会被截断为固定宽度的整数。
特别是,不保证以下内容:
- 无法保证 Ruby 实现使用任何特定的散列算法。
- 不能保证一个对象的哈希值在不同的 Ruby 实现中是相同的。
- 不能保证对象的哈希值在同一个 Ruby 实现的不同版本之间是相同的。
- 不能保证对象的哈希值在同一 Ruby 实现的同一版本的不同进程之间是相同的。
- 不能保证对象的哈希值在同一 Ruby 实现的同一版本的同一进程中的同一代码的不同运行之间是相同的。
事实上,出于安全目的,一些 Ruby 实现会随机化哈希码。
换句话说,在 Ruby 中甚至没有办法知道对象在运行时的哈希码是什么,所以在 ECMAScript 中绝对没有办法知道这一点。