算法 对于 md5 字符串,有没有 hash 函数可以映射成整数

yakczh · 2013年11月11日 · 最后由 luikore 回复于 2013年11月12日 · 9267 次阅读

用函数来实现一一对应

java 的 string 类有个 hashcode 方法返回一个 int 的值

"md5string".to_sym.__id__ 可以吗?

.id不行,我试过

对象自带的 hash 方法不行吗?

"xxoo".hash

#4 楼 @skandhas 这个会变动

$ irb
irb(main):003:0> "aa".hash
=> 3777933626280241396
irb(main):004:0> exit

$ irb
irb(main):001:0> "aa".hash
=> -2547269650278437418
irb(main):002:0>

#5 楼 @huacnlee 嗯。

The hash value for an object may not be identical across invocations or implementations of ruby. If you need a stable identifier across ruby invocations and implementations you will need to generate one with a custom method.

实际需求到底是啥?md5 本来不就是个数么……

#7 楼 @aptx4869 对滴。

楼主直接

'89400617397134a1fc9c9fbcb7e1d10a'.to_i(16)

就可以把串转成数了。 不过没必要啊。

匿名 #9 2013年11月11日

这样?

Digest::MD5.hexdigest("abcde").unpack("Q")[0]

或者: Digest::MD5.hexdigest("c").to_i 16

10 楼 已删除

'aa'.to_sym.object_id 'aa'.to_sym 就已经唯一了

#8 楼 @skandhas 数值在比较运算的时候有优势

#11 楼 @sevk
puts 'aa'.to_sym.object_id win7 212840 centos 109378

嗯,那就 Digest::MD5.digest("aa")

md5 本身就是一个 16 进制的字符串,to_i(16) 一下转成 10 进制就好,不过没明白转成 10 进制有啥用。

简单的讲,不能映射,md5 是 128 位的,而整型最多 64 位,m5 的数据空间可比整型大多了。也许你要的是个布隆过滤器

一一映射是不太可能的吧,理由 18 楼讲了。就算用 to_i(16) 转成数字,因为绝大多数 cpu 都不是 128 位的,无法原生支持 128 位数字的运算,还是需要把 128 位分成几段来操作。Ruby 用 Bignum 表示大数,楼主正好可以测试一下 Bignum 的性能。

如果是搜索一个文本字段,数据库内建的哈希索引就可以了,不需要自己算 md5 啊。

如果是 mongodb, 截取 12 字节设成 id 存进去也行 (digest[0...24].to_i 16), 也算是保留了哈希索引,还有自动 sharding, 不过每个记录都得是个数组。

如果硬要转整型字段,截取 8 字节也行 (digest[0...16].to_i 16), 不过一般数据库对整数字段的索引默认是二叉的,往往还没哈希索引快。

如果是做反查 md5 用,数据海量,最好不要用现成数据库,自己建索引吧

需要 登录 后方可回复, 如果你还没有账号请 注册新账号