加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 用于将整数映射到给定范围的哈希函数?

发布时间:2020-12-15 22:05:56 所属栏目:大数据 来源:网络整理
导读:我有一组整数,每个整数有8,9或10位数.我有数百万.我想将它们中的每一个映射到1到1000范围内的整数.我不能对整数进行简单的修改,因为这些数字的发布方式存在系统性偏差(例如,偶数数字比奇数),所以 $id % 1000 会产生更频繁的偶数和更少的奇数.是否有任何简单
我有一组整数,每个整数有8,9或10位数.我有数百万.我想将它们中的每一个映射到1到1000范围内的整数.我不能对整数进行简单的修改,因为这些数字的发布方式存在系统性偏差(例如,偶数数字比奇数),所以
$id % 1000

会产生更频繁的偶数和更少的奇数.是否有任何简单的函数(数学或棘手的函数进行按位运算),这有助于我在Perl或R中进行映射?非常感谢提前.

解决方法

你基本上要求一个哈希函数将数字映射到0到999之间的值.

要构造它,您可以首先使用散列函数去除映射到的值中的任何系统模式,然后使用mod将输出限制为0到999之间的值.

这是该想法的R实现:

library(digest)
set.seed(1)

(x <- sample(1e9,size=6))
# [1] 265508664 372123900 572853364 908207790 201681932 898389685

## To hash R's internal representation of these numbers
strtoi(substr(sapply(x,digest),28,32),16L) %% 1e3
# [1] 552 511 233 293 607 819

## Or,for a hash mapping that's comparable to other programs' md5 hash 
## implementations
strtoi(substr(sapply(as.character(x),digest,serialize=FALSE),16L) %% 1e3
# [1] 153 180 892 294 267 807

将单行内容分解为碎片应该会使它更清晰:

## Compute md5 hash of R representation of each input number
(sapply(x,digest))
# [1] "a276b4d73a46e5a827ccc1ad970dc780" "328dd60879c478d49ee9f3488d71a0af"
# [3] "e312c7f09be7f2e8391bee2b85f77c11" "e4ac99a3f0a904b385bfdcd45aca93e5"
# [5] "470d800a40ad5bc34abf2bac4ce88f37" "0008f4edeebbafcc995f7de0d5c0e5cb"

## Only really need the last few hex digits
substr(sapply(x,32)
# [1] "dc780" "1a0af" "77c11" "a93e5" "88f37" "0e5cb"

## Convert hex strings to decimal integers
strtoi(substr(sapply(x,16L)
# [1] 903040 106671 490513 693221 560951  58827

## Map those to range between 0 and 999
strtoi(substr(sapply(x,16L) %% 1e3
# [1]  40 671 513 221 951 827

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读