美文网首页
iOS 哈希碰撞

iOS 哈希碰撞

作者: 口子窖 | 来源:发表于2021-08-24 14:16 被阅读0次

iOS 哈希碰撞

一、问题背景

最近遇到一个生产问题,hash碰撞引发的页面卡死。原始需求是想把一个数组随机打散,开发同学手抄了百度的一篇文章文章连接

-(NSMutableArray*)getRandomArrFrome:(NSArray*)arr
{
    NSMutableArray *newArr = [NSMutableArray new];
    while (newArr.count != arr.count) {
        //生成随机数
        int x =arc4random() % arr.count;
        id obj = arr[x];
        if (![newArr containsObject:obj]) {
            [newArr addObject:obj];
        }
    }
    return newArr;
}

这是网摘的代码片段,本身没什么大的问题,containsObject方法的时候需要重写- (BOOL)isEqual:(id)object方法。于是就有了以下的改造

@implementation TestModel
- (BOOL)isEqual:(TestModel *)object {
    BOOL same = self.hash == object.hash;
    if (same) {
        NSLog(@"%@:%lu=================%@:%lu",self.name,(unsigned long)self.hash,object.name,(unsigned long)object.hash);
    }
    return same;
}
- (NSUInteger)hash {
    return self.name.hash;
}
@end

二、问题产生

当时开发的同学思路是这样,起一个while,从原始数组里随机选择一个数据塞到目标数组中,N个循环之后判断原始数组和目标数组个数相等,就认为打散任务完成。而判断相等的条件是model中的name属性做hash运算(至于为什么这么做已经无从考证)。
上午的生成问题排查的结果就是发现两个字符串hash过后的结果一致@"200179032648"和@"200179026087",导致while死循环。

三、问题解决

换一种思路来实现乱序,在此就不赘述,直接贴代码

- (NSArray *)getRandomArrayFrom:(NSArray *)arr
{
    NSMutableArray *resultArray = [NSMutableArray arrayWithArray:arr];
    for (int i = 0; i <arr.count; i++) {
        int index = arc4random() % arr.count;
        [resultArray exchangeObjectAtIndex:i withObjectAtIndex:index];
    }
    return resultArray;
}

相关文章

  • iOS 哈希碰撞

    iOS 哈希碰撞 一、问题背景 最近遇到一个生产问题,hash碰撞引发的页面卡死。原始需求是想把一个数组随机打散,...

  • 哈希表

    映射(Map) 和 集合(Set) 哈希表(HashTable)、哈希函数(Hash Function)、哈希碰撞...

  • 哈希碰撞的解决办法

    哈希碰撞的解决办法 哈希碰撞指的是两个不同的key经过哈希后得到的数值是一样的,就产生了冲突或者碰撞 开放地址法 ...

  • HashMap面试基础

    HashMap 必备知识——哈希表 哈希表 哈希函数 哈希碰撞 解决办法 1. 拉链法 2. 线性探测法 Hash...

  • 数据结构 -- 哈希表及其应用

    这篇主要用来记录一下学习到的关于哈希表的知识点。 文章结构 哈希表 哈希表的定义 哈希表的优缺点 哈希碰撞 负载因...

  • MIT算法导论七 哈希表

    - 哈希表- 哈希函数选择- 哈希碰撞 由“符号表问题”引入什么是哈希有一个表S有n条记录,每个记录(通常认为是指...

  • HashMap、ArrayMap、SparseArray

    1、HashMap 1、哈希表,散列法,哈希碰撞处理等的理解 http://blog.sina.com.cn/s/...

  • Java HashMap

    哈希表 核心是基于哈希值的桶和链表 O(1) 的平均查找、插入、删除时间 致命缺陷是哈希值的碰撞(collisio...

  • 数据结构和算法

    1.哈希表哈希算法详解(附带 iOS 开发中实际应用) 2.链表iOS 数据结构之链表

  • HASH表的原理和实现

    哈希表的原理 什么是哈希? 哈希相当于一个人的名字,可以通过名字可以找到这个人 什么是哈希碰撞? 假设一个班级里边...

网友评论

      本文标题:iOS 哈希碰撞

      本文链接:https://www.haomeiwen.com/subject/hxldiltx.html