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

NABhash 欢迎试用, 40GB/s 哈希速度

  •  
  •   mengzhuo · 2019-04-24 23:56:54 +08:00 · 3946 次点击
    这是一个创建于 1827 天前的主题,其中的信息可能已经有所发展或是发生改变。

    https://github.com/mengzhuo/nabhash

    现在只有 Go 版本

    22 条回复    2019-09-01 00:06:02 +08:00
    blless
        1
    blless  
       2019-04-25 01:19:38 +08:00 via Android
    跟 xxhash 对比有啥优势吗?
    blless
        2
    blless  
       2019-04-25 01:29:59 +08:00 via Android
    40g ……有点夸张 mark 明天再看
    hearfish
        3
    hearfish  
       2019-04-25 06:08:40 +08:00
    meow hash 啊,利用硬件 aes 指令来达到这速度,挺好挺好
    bestkayle
        4
    bestkayle  
       2019-04-25 07:49:46 +08:00 via iPhone
    官网打不开
    mscb
        5
    mscb  
       2019-04-25 07:51:04 +08:00 via Android
    支持一下,一直在关注楼主的博客😁
    mengzhuo
        6
    mengzhuo  
    OP
       2019-04-25 08:02:06 +08:00 via iPhone
    @hearfish 参考了 meow hash 的思路,主要是 meow hash 在 final block 的处理上太复杂了, nab 把长度按 uint64 xor 进 state 里就行了。
    mengzhuo
        7
    mengzhuo  
    OP
       2019-04-25 08:03:13 +08:00 via iPhone
    @blless 快一些~
    murmur
        8
    murmur  
       2019-04-25 08:13:43 +08:00
    楼主你的使用场景是什么,既然是基于 AES 那就不是标准 hash,为什么我不用更快的 crc32 呢
    reus
        9
    reus  
       2019-04-25 08:29:40 +08:00
    @murmur crc32 是纠错用的,不是 hash 用的…
    tempdban
        10
    tempdban  
       2019-04-25 08:35:20 +08:00 via Android
    @reus 实际上 crc32 广泛的用来做 hash
    mengzhuo
        11
    mengzhuo  
    OP
       2019-04-25 10:20:33 +08:00
    @murmur hash 没有标准不标准。
    只有是否 Crypto-Safe 和 SMhasher 测试过不过的问题。
    For Fun 也是一个作用嘛~

    @tempdban 那就用得有问题了。hash 只是 checksum 的子集,checksum 并不保证冲突,只是校验有没有更改。
    tempdban
        12
    tempdban  
       2019-04-25 11:06:44 +08:00
    @mengzhuo hash 又不是只能当签名用?
    tempdban
        13
    tempdban  
       2019-04-25 11:07:20 +08:00
    @mengzhuo “那就用得有问题了” 还是建议少说这种话
    blless
        14
    blless  
       2019-04-25 11:21:02 +08:00
    data size: 4350
    goos: windows
    goarch: amd64
    pkg: gitlab.dianchu.cc/DevOpsGroup/goutils/structhash
    BenchmarkSpeed/xxhash-8-12 30000000 39.2 ns/op 204.07 MB/s 8 B/op 1 allocs/op
    BenchmarkSpeed/nabhash-8-12 20000000 73.0 ns/op 109.54 MB/s 80 B/op 2 allocs/op
    BenchmarkSpeed/xxhash-16-12 30000000 40.6 ns/op 394.15 MB/s 8 B/op 1 allocs/op
    BenchmarkSpeed/nabhash-16-12 20000000 72.1 ns/op 221.90 MB/s 80 B/op 2 allocs/op
    BenchmarkSpeed/xxhash-32-12 50000000 40.2 ns/op 796.20 MB/s 8 B/op 1 allocs/op
    BenchmarkSpeed/nabhash-32-12 20000000 70.6 ns/op 453.30 MB/s 80 B/op 2 allocs/op
    BenchmarkSpeed/xxhash-64-12 30000000 42.3 ns/op 1512.89 MB/s 8 B/op 1 allocs/op
    BenchmarkSpeed/nabhash-64-12 20000000 62.6 ns/op 1021.62 MB/s 80 B/op 2 allocs/op
    BenchmarkSpeed/xxhash-128-12 30000000 47.2 ns/op 2710.10 MB/s 8 B/op 1 allocs/op
    BenchmarkSpeed/nabhash-128-12 20000000 62.9 ns/op 2034.49 MB/s 80 B/op 2 allocs/op
    BenchmarkSpeed/xxhash-256-12 30000000 55.9 ns/op 4577.90 MB/s 8 B/op 1 allocs/op
    BenchmarkSpeed/nabhash-256-12 20000000 64.6 ns/op 3961.26 MB/s 80 B/op 2 allocs/op
    BenchmarkSpeed/xxhash-512-12 20000000 73.0 ns/op 7018.40 MB/s 8 B/op 1 allocs/op
    BenchmarkSpeed/nabhash-512-12 20000000 67.1 ns/op 7625.44 MB/s 80 B/op 2 allocs/op
    BenchmarkSpeed/xxhash-1024-12 20000000 106 ns/op 9648.91 MB/s 8 B/op 1 allocs/op
    BenchmarkSpeed/nabhash-1024-12 20000000 73.3 ns/op 13975.12 MB/s 80 B/op 2 allocs/op
    BenchmarkSpeed/xxhash-2048-12 10000000 181 ns/op 11261.76 MB/s 8 B/op 1 allocs/op
    BenchmarkSpeed/nabhash-2048-12 20000000 89.7 ns/op 22825.68 MB/s 80 B/op 2 allocs/op
    BenchmarkSpeed/xxhash-4096-12 5000000 323 ns/op 12679.08 MB/s 8 B/op 1 allocs/op
    BenchmarkSpeed/nabhash-4096-12 10000000 124 ns/op 32986.55 MB/s 80 B/op 2 allocs/op

    win10 i8700 go1.12 跑了下测试
    我用的 https://github.com/cespare/xxhash
    数据大于 512 字节开始就比 xxhash 快了
    reus
        15
    reus  
       2019-04-25 11:35:33 +08:00
    @tempdban 哦,你喜欢啦。
    mengzhuo
        16
    mengzhuo  
    OP
       2019-04-25 20:43:28 +08:00
    @tempdban

    不是语气问题。
    Hash 至少要满足 collision free 的,至少 CRC32 是不满足的,拿来做 Hash 就会出现重复键的数据,程序就会出错的。

    https://stackoverflow.com/questions/460576/hash-code-and-checksum-whats-the-difference
    tempdban
        17
    tempdban  
       2019-04-25 21:26:05 +08:00   ❤️ 1
    @mengzhuo https://doc.dpdk.org/api/rte__hash__crc_8h.html 本来我没想和你犟这个事,你贴的网页你自己都不看的么。
    “拿来做 Hash 就会出现重复键的数据”
    你的 HASH 能没有冲突?
    mengzhuo
        18
    mengzhuo  
    OP
       2019-05-02 23:54:53 +08:00
    @tempdban 这个 Collision free 是指可行的范围内,不要强掰“所有 hash 都不能冲突”。
    CRC32 只能生成 32 位的 hash 值,也就是最多 2^32 个数据( 4294967296 ),也就 40 亿。
    sha1,ipv6 或者我的算法都是 128 位,最多 2^128 ( 3.4028237e+38 ),比所有目前可观测的星星都多 200 倍。

    p.s. 为了验证冲突率,我还特意添加了 Smhasher
    https://github.com/aappleby/smhasher/wiki/SMHasher
    结果所有测试都通过了,这下我更加放心了。
    mengzhuo
        19
    mengzhuo  
    OP
       2019-05-02 23:57:02 +08:00
    @bestkayle 好了,加了张图

    Github page 真香哈
    tempdban
        20
    tempdban  
       2019-05-03 00:09:18 +08:00 via Android
    @mengzhuo 没完没了了,我 CRC32 几个周期,你的 hash 几个周期,可行范围内,你知道我可行范围是啥啊。
    我完全没说你的算法问题,我只是告诉那个人,有很多 hash 是 CRC 做的,完全不带情绪。
    第一条甚至都没 @你
    你的东西好,行,高性能软件里无数的 hash 都是 CRC 做的,人也没觉得冲突大啊。
    那就用得有问题了,这是你原话,这些年用的好好的凭什么到你这就有问题。
    我就问你 crc32 能不能做 hash ?扯这么多干什么
    reus
        21
    reus  
       2019-08-13 14:58:53 +08:00
    @tempdban 我一开始就应该说 crypto-safe hash。AES 是 crypto-safe 的 hash,crc 不是,所以 crc 就算再快,也不能替代。
    tempdban
        22
    tempdban  
       2019-09-01 00:06:02 +08:00 via Android
    @reus 这话没毛病。
    不过有的人就是实现个性能还不错的哈希表,crc32 是首选。
    但是咱不能说
    crc32 是纠错用的,不是 hash 用的…
    老哥你当时多打两个字 我和楼主就没必要犟这么半天了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5581 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 03:35 · PVG 11:35 · LAX 20:35 · JFK 23:35
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.