我正在尝试实现一个id混淆方案,使用从别处借用的简单散列。我在应用程序帮助器上添加了一个方法:
@@M_ID = 2**31-1
@@PRIME = 1580030173
@@PRIME_INVERSE = 59260789 # (calculated from MAXID and PRIME offline)
def obfuscate_id(x)
if x
return ((x * @@PRIME) & @@M_ID)
else
x
end
end出于某种原因,无论何时调用它,ruby都会锁定,并开始耗尽我mac上的磁盘空间……就像-演唱会一样。有什么想法吗?
发布于 2012-06-20 05:14:32
你确定x是一个数字吗?如果x是一个字符串,我可以看到这种情况的发生--在Ruby语言中,string乘以number会给出重复的字符串连接:
irb(main):004:0> "hi" * 32
=> "hihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihihi"而且你的@@PRIME确实足够大,足以吞噬大量的内存。如果是这样的话,添加to_i应该可以解决这个问题(并且您的条件可能会消失):
irb(main):007:0> "hi".to_i * 32
=> 0
irb(main):008:0> "32".to_i * 32
=> 1024希望这能有所帮助!
https://stackoverflow.com/questions/11108258
复制相似问题