• Jason A. Donenfeld's avatar
    siphash: implement HalfSipHash1-3 for hash tables · 1ae2324f
    Jason A. Donenfeld authored
    
    
    HalfSipHash, or hsiphash, is a shortened version of SipHash, which
    generates 32-bit outputs using a weaker 64-bit key. It has *much* lower
    security margins, and shouldn't be used for anything too sensitive, but
    it could be used as a hashtable key function replacement, if the output
    is never exposed, and if the security requirement is not too high.
    
    The goal is to make this something that performance-critical jhash users
    would be willing to use.
    
    On 64-bit machines, HalfSipHash1-3 is slower than SipHash1-3, so we alias
    SipHash1-3 to HalfSipHash1-3 on those systems.
    
    64-bit x86_64:
    [    0.509409] test_siphash:     SipHash2-4 cycles: 4049181
    [    0.510650] test_siphash:     SipHash1-3 cycles: 2512884
    [    0.512205] test_siphash: HalfSipHash1-3 cycles: 3429920
    [    0.512904] test_siphash:    JenkinsHash cycles:  978267
    So, we map hsiphash() -> SipHash1-3
    
    32-bit x86:
    [    0.509868] test_siphash:     SipHash2-4 cycles: 14812892
    [    0.513601] test_siphash:     SipHash1-3 cycles:  9510710
    [    0.515263] test_siphash: HalfSipHash1-3 cycles:  3856157
    [    0.515952] test_siphash:    JenkinsHash cycles:  1148567
    So, we map hsiphash() -> HalfSipHash1-3
    
    hsiphash() is roughly 3 times slower than jhash(), but comes with a
    considerable security improvement.
    
    Signed-off-by: default avatarJason A. Donenfeld <Jason@zx2c4.com>
    Reviewed-by: default avatarJean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    1ae2324f