【问题标题】:128 bit Integer hash function128位整数散列函数
【发布时间】:2013-07-20 21:40:02
【问题描述】:

寻找字符串到整数散列函数,其值在 mysql bigint unsigned 数据类型 (0 <= n <= 18446744073709551615) 的范围内。将 md5/sha1 转换为以 16 为底的整数不符合此要求。

【问题讨论】:

  • 你的哈希函数需要什么样的属性?它应该是加密的吗?它需要快速吗?我希望它需要在程序的不同执行中保持一致。
  • @user2357112 没有加密。该值将用作字符串的整数键值。低碰撞要求是必须的。
  • 本质上你想要一个 64 位的散列。维基百科有一些被列为 64 位加密和非加密的,包括 RIPEMD-64、Siphash、elf64 等。为什么哈希大小如此有限?
  • @ChrisJ 谢谢。哈希大小受 mysql 列数据类型的限制,不允许更改。

标签: python mysql hash bigint


【解决方案1】:

Java 使用应该适合您的rolling hash

来自java.lang.String

public int hashCode() {
    int h = hash;
    if (h == 0 && count > 0) {
        int off = offset;
        char val[] = value;
        int len = count;

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }
        hash = h;
    }
    return h;
}

这个想法是将哈希计算为:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

要处理溢出,您可以添加一个步骤,将哈希与18446744073709551615 进行检查,如果它较大,则采用哈希的mod18446744073709551615

【讨论】:

    猜你喜欢
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 2015-11-28
    • 2010-10-14
    • 2012-02-09
    • 2018-04-06
    • 2011-09-03
    • 1970-01-01
    相关资源
    最近更新 更多