慎用HashCode作为Unique Key

在处理数据并进行groupBy操作时,面对<month, baseId, amount>的数据结构,通常需要生成唯一的键值来汇总相同组的数据。虽然直接字符串拼接能形成键值,但有人建议使用哈希函数如MD5生成键。然而,哈希碰撞的风险存在,即使是MD5也可能导致相同的键值。因此,不应依赖HashCode来生成唯一键,因为其更容易发生碰撞,从而影响数据的正确聚合。" 123811841,11821260,2022年Android面试深度解析:从基础到框架,"['Android开发', '面试经验', '开发语言', '性能优化']
摘要由CSDN通过智能技术生成

处理数据的过程中,希望对数据进行groupBy操作。举个例子,data的组成是<month, baseId, amount>。

数据A = <"2019-03","195",100>

数据B = <"2019-04","185", 200>

数据C = <"2019-03","195", 300>

数据D = <"2019-04","185", 400>

希望算出相同<month, baseId>的金额之和,其实如果用mysql就很好解决:

SELECT sum(amount) FROM data GROUP BY month, baseId

但是在java代码中怎么办呢?可以考虑用到 Java8 的流特性:

Map<String, List<XXX>> grouped = list.stream()
            .collect(groupingBy(keyGenerator::buildKey));

可以把相同<month, baseId>作为一个唯一的键值,根据键值来汇总相同<month, baseId>的数据。

那么如何生成唯一的键值呢?其实如果不考虑性能因素,直接字符串拼接,类似于“month-baseId",就可以作为一个key了。但是有的人就想,是不是可以采取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值