【问题标题】:how to mapping 100 million string into 100 thousand int?如何将 1 亿个字符串映射为 10 万个 int?
【发布时间】:2016-04-08 21:32:59
【问题描述】:

我有大约 1 亿个简单的键值对(它是遗留数据,永远不需要更新,并且键是随机字符串),我想将它们存储在 redis 中以供查询。

我的想法是我使用前四个字符作为哈希键,并将它们存储为哈希类型,因此redis中有大约一百万个哈希键,每个哈希键大约有1000个子键。

但事情并没有按计划进行。由于某种原因,我发现有些哈希键只有一个子键,但有些有超过 500,000 个子键,它们在内存中的编码效率可能不高。

所以我想知道是否有一些简单易懂的算法可以将我的 1 亿个字符串平均分成 10 万个桶(整数)。当我拿起一个字符串时,我可以使用相同的算法知道它的去向。

谢谢!!

【问题讨论】:

  • 使用 Trie (en.wikipedia.org/wiki/Trie) 存储所有密钥怎么样?
  • 你是说有些前缀只出现一次,而有些前缀出现50万次?

标签: algorithm hash redis


【解决方案1】:

仅使用字符串的一小部分来计算散列函数可能是个问题,因为例如,您的字符串可能都共享相同的前缀。

有一个字符串哈希函数的描述,它在http://www.javamex.com/tutorials/collections/hash_function_technical_2.shtmlGood Hash Function for Strings处获取整个字符串(实际上它们对同一函数给出了两种不同的描述)。

看待这一点的一种方法是将字符串的字符视为 A + Bx + Cx^2 + Dx^3 形式的多项式的系数 A,B,C... 在这种情况下x 是 31,算术是模 2^32。如果 x 选择得当,那么这是一个有很多经验的方案,并且可能会应用一些数学,从而使其具有良好的特性。更好的是对哈希表的大小进行算术运算,并选择哈希表的大小作为素数。如果您的数据是静态的,则可能值得尝试围绕您喜欢的表格大小和 x 的几个不同值的几个不同的素数,然后选择可以为您提供最均匀填充表格的组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    • 2019-08-01
    相关资源
    最近更新 更多