V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
rizon
V2EX  ›  程序员

hashmap 中哈希函数计算出来的结果是个什么东西?怎么用来定位内存地址的?

  •  
  •   rizon ·
    othorizon · 2019-07-24 12:21:14 +08:00 · 2535 次点击
    这是一个创建于 1948 天前的主题,其中的信息可能已经有所发展或是发生改变。

    hashmap 通过 hash 函数计算 key 得到存储地址?
    但是没看到什么资料来解释这个存储地址是个什么东西,为什么有了这个 hash 结果就可以直接定位到具体的内存存储地址?

    10 条回复    2019-07-24 13:56:41 +08:00
    hhw123
        1
    hhw123  
       2019-07-24 12:25:59 +08:00 via iPhone
    看看数据结构
    Weixiao0725
        2
    Weixiao0725  
       2019-07-24 12:34:37 +08:00
    这还要依赖具体的 HashMap 的存储结构,以 Java 中的链地址法为例,计算完 hash 值以后还要做一次模运算确定元素所在的 slot 位置,即 `index=hash%Entry[].length`,这个 index 才是你说的跟地址相关的。
    zado
        3
    zado  
       2019-07-24 12:34:56 +08:00
    具体地址 = 起始地址 + ( hash * 单位大小);
    VDimos
        4
    VDimos  
       2019-07-24 12:36:40 +08:00 via Android
    key 可以计算出 offset 的,根据这个 offset 去获取就行了
    lastpass
        5
    lastpass  
       2019-07-24 12:37:32 +08:00 via Android
    java 本身隐藏了指针。这个东西是模拟的指针。并不是真正的内存地址。
    lihongjie0209
        6
    lihongjie0209  
       2019-07-24 12:39:27 +08:00
    在 java 中没有内存地址的说法.

    hash 底层的实现要不是数组, 要不是树.

    hash 最后得到的一定是一个数组中的元素或者是树的节点, 是一个对象
    ic2y
        7
    ic2y  
       2019-07-24 13:15:33 +08:00   ❤️ 1
    hashcode 是在 JVM 里实现的

    这个值,可以通过配置参数,改变行为 (-XX:hashCode=1)
    0. A randomly generated number.
    1. A function of memory address of the object.
    2. A hardcoded 1 (used for sensitivity testing.)
    3. A sequence.
    4. The memory address of the object, cast to int.
    5. Thread state combined with xorshift ( https://en.wikipedia.org/wiki/Xorshift)

    JDK6 和 7 默认使用 0,一个随机数算法 http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/file/87ee5ee27509/src/share/vm/runtime/os.cpp#l814。
    JDK8 开始默认使用 5,是一个跟线程有关的生成算法。
    dartabe
        8
    dartabe  
       2019-07-24 13:54:26 +08:00
    教科书上讲的多是模运算 不过实际应用上应该是映射到相同的地址少的算法都可以吧
    dartabe
        9
    dartabe  
       2019-07-24 13:55:45 +08:00
    其实就一道 leetcode easy 的题
    reus
        10
    reus  
       2019-07-24 13:56:41 +08:00
    所有数据结构书都会讲到,为什么不看?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2322 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 15:58 · PVG 23:58 · LAX 07:58 · JFK 10:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.