将字符串的MD5作为整数x
的128位表示形式,如何在Google中计算x % y
,其中y
通常相对较小(大约1000)?
Bigquery有一个MD5函数,返回带有16个字节(即128位)的BYTES
类型的结果。
(背景:这是用来计算确定性伪随机数的。但是,由于遗留和兼容性的原因,我在算法上没有灵活性!尽管我们知道它有一个https://stackoverflow.com/a/13104569。)
对于不同的输入字符串和不同的模块,每天需要进行数百万/数十亿次的操作,因此希望能够有效地完成。作为倒退,我可以用另一种语言从外部计算它,然后上传到Bigquery;但是如果我可以在Bigquery中直接这样做,那就太好了。
我学过很多数论,所以也许我们可以用一些数学技巧。然而,我仍然停留在更基本的BiqQuery问题上
BYTES
数组访问字节的子范围吗?发布于 2019-12-20 08:43:17
使用数学力量和一个长时SQL函数:
CREATE TEMP FUNCTION modulo_md5(str ANY TYPE, m ANY TYPE) AS ((
SELECT MOD(MOD(MOD(MOD(MOD(MOD(MOD(MOD(MOD(MOD(MOD(MOD(MOD(MOD(MOD(MOD(0
* 256 + num[OFFSET(0)], m )
* 256 + num[OFFSET(1)], m )
* 256 + num[OFFSET(2)], m )
* 256 + num[OFFSET(3)], m )
* 256 + num[OFFSET(4)], m )
* 256 + num[OFFSET(5)], m )
* 256 + num[OFFSET(6)], m )
* 256 + num[OFFSET(7)], m )
* 256 + num[OFFSET(8)], m )
* 256 + num[OFFSET(9)], m )
* 256 + num[OFFSET(10)], m )
* 256 + num[OFFSET(11)], m )
* 256 + num[OFFSET(12)], m )
* 256 + num[OFFSET(13)], m )
* 256 + num[OFFSET(14)], m )
* 256 + num[OFFSET(15)], m )
FROM (SELECT TO_CODE_POINTS(MD5(str)) num)
));
SELECT title, modulo_md5(title, 177) result, TO_HEX(MD5(title)) md5
FROM `fh-bigquery.wikipedia_v3.pageviews_2019`
WHERE wiki='en'
LIMIT 100000
现在您可以使用它作为一个持久的共享UDF:
SELECT fhoffa.x.modulo_md5("any string", 177) result
https://stackoverflow.com/questions/59423636
复制