如何设计一个可以降低哈希冲突可能的哈希函数? - V2EX
1oNflow
V2EX    Java

如何设计一个可以降低哈希冲突可能的哈希函数?

  •  
  •   1oNflow Dec 3, 2019 5043 views
    This topic created in 2351 days ago, the information mentioned may be changed or developed.

    有必要重写 Java 基本类型的 hashcode 吗,比如 String 用到的 31,官方已经优化的很好了吧。

    如果是求对象的哈希,就递归调用成员的 hashcode,再把他们加在一起,还有比这个更好的方案吗?

    10 replies    2019-12-04 08:31:32 +08:00
    OhYee
        1
    OhYee  
       Dec 3, 2019
    先把对象成员的值转换成字节数组再对整个字节数组做哈希碰撞概率应该会更低一点(但是感觉不太必要)
    真的怕碰撞,可以换成别的哈希函数来实现哈希,比如 SHA3,或者自己魔改下 SHA,把输出长度拓展到更长
    reus
        2
    reus  
       Dec 3, 2019
    sha256 够了,还怕就 sha512。

    就,如果你找到了一个冲突,可以出名那种。
    crclz
        3
    crclz  
       Dec 3, 2019
    wangyzj
        4
    wangyzj  
       Dec 3, 2019
    我看到了一个好大的轮子
    geelaw
        5
    geelaw  
       Dec 3, 2019
    @reus #2 Java 的 hash code 是 32 位,但 SHA-256/512 的输出远远长于 32 位

    实际上一个很快速的策略是使用 AES + 固定 key + 截断,因为现代 CPU 有 AES 指令,所以这个可以非常非常快。此外,通常数据如果没有 adversarial behavior,那么 AES hash 的碰撞率比较低。

    把数个成员的 hash 加在一起是一个非常糟糕的方案,比如 class X { int a, b; /* details omitted */ } 那么 (1,0) 和 (0,1) 一定会有相同的 hash。
    xupefei
        6
    xupefei  
       Dec 3, 2019 via iPhone
    用多级哈希。现成的实现是 bloom filter。
    zunceng
        7
    zunceng  
       Dec 3, 2019
    当年听人吹过暴雪有个 hash 算法 从来没用上过
    Raymon111111
        8
    Raymon111111  
       Dec 3, 2019
    楼主的意思是针对任意的槽大小, hash 结果可以均匀分布吧
    hzgit
        9
    hzgit  
       Dec 3, 2019
    我看到了一个好大的轮子
    fluorinedog
        10
    fluorinedog  
       Dec 4, 2019 via Android
    用 hash_combine 算法,别自己造轮子
    About     Help     Advertise     Blog     API     FAQ     Solana     1066 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 46ms UTC 22:49 PVG 06:49 LAX 15:49 JFK 18:49
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86