• 请不要在回答技术问题时复制粘贴 AI 生成的内容
leebs
V2EX  ›  程序员

字符串映射成数字,有什么好的算法嘛

  •  
  •   leebs · Mar 9, 2022 · 5579 views
    This topic created in 1605 days ago, the information mentioned may be changed or developed.

    用 bitmap 存储数据,需要对数据做 offset 映射,有什么好的算法嘛。

    21 replies    2022-03-09 15:30:54 +08:00
    kilasuelika
        1
    kilasuelika  
       Mar 9, 2022 via Android   ❤️ 1
    啥叫 offset 映射
    F281M6Dh8DXpD1g2
        2
    F281M6Dh8DXpD1g2  
       Mar 9, 2022
    murmurhash3
    CEBBCAT
        3
    CEBBCAT  
       Mar 9, 2022 via iPhone
    你……是要做布隆过滤器吗?
    murmur
        4
    murmur  
       Mar 9, 2022
    offset 映射是啥意思,记住用户看书看到的地方?
    dangyuluo
        5
    dangyuluo  
       Mar 9, 2022
    leebs
        6
    leebs  
    OP
       Mar 9, 2022
    @kilasuelika offset 是偏移量,bitmap 里面的概念,相当于数组下标。
    leebs
        7
    leebs  
    OP
       Mar 9, 2022
    @dangyuluo 任意字符串,不是数字字符串,需要编码成数字。
    dangyuluo
        8
    dangyuluo  
       Mar 9, 2022
    那就 md5 然后取前 64bit 做 uint64_t?
    gwbw
        9
    gwbw  
       Mar 9, 2022
    参考 base64 的算法,映射成 base10 ,用 0~9 表示,这种么;要求纯数字的话可能要 base9 ,留一个数字专门补位
    Yi23
        10
    Yi23  
       Mar 9, 2022
    如果单纯的字符串转数字的话,是否可以考虑 36 进制( 26 个英文+10 个数字)转换?但这样子可能会导致转出来的数字会非常大
    hu8245
        11
    hu8245  
       Mar 9, 2022 via Android
    面腾讯就问的这个,蹲一个方案💬
    X0ray
        12
    X0ray  
       Mar 9, 2022
    这?直接 hash 不行吗
    also24
        13
    also24  
       Mar 9, 2022   ❤️ 1
    直觉上是一个 X-Y Problem

    如果是构建布隆过滤器的话,那二进制数据无需转换,直接就能塞进 bitmap ,不需要特殊处理。


    如果是想用 bitmap 的下标来表示一个数据的话,那除非特定场景,效率是极低的,基本不存在实际的可行性,用下来还不如直接 hashmap 好用。
    labulaka521
        14
    labulaka521  
       Mar 9, 2022 via iPhone   ❤️ 1
    zhongchaowade
        15
    zhongchaowade  
       Mar 9, 2022
    所以需要同时支持正负数,8 ,10 ,16 进制吗?
    lniwn
        16
    lniwn  
       Mar 9, 2022 via iPhone
    难道在说 ascii 码?
    EminemW
        17
    EminemW  
       Mar 9, 2022
    hash 然后 mod ?
    Masonnn
        18
    Masonnn  
       Mar 9, 2022
    md5? sha256?
    3dwelcome
        19
    3dwelcome  
       Mar 9, 2022
    有个叫 perfect hash 的算法,可以满足楼主的需求。

    举个例子,有 10 万个字符串需要查重,那么在 redis 里创建一个大小为 10 万的 bitmap 数据结构,用 0 和 1 来表示,当前字符串是否已被占用。

    先对 10 万个字符串做预处理,便可以得到一个不冲突,又刚好完美 1:1 匹配进 bitmap ,自定义 hash 映射表。
    littlewing
        20
    littlewing  
       Mar 9, 2022
    楼上说 hash 的,冲突怎么解决?
    3dwelcome
        21
    3dwelcome  
       Mar 9, 2022
    @littlewing “楼上说 hash 的,冲突怎么解决?”

    完美 hash 没冲突。否则就不叫完美了。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1268 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 48ms · UTC 17:19 · PVG 01:19 · LAX 10:19 · JFK 13:19
    ♥ Do have faith in what you're doing.