字符串上的唯一整数/长哈希密钥生成,以便更快地进行比较

Sha*_*baz 24 string algorithm hash comparison

我很好奇其他人是如何解决这个问题的,以及天真解决方案背后可能存在的问题:

我有一个处理股市数据的系统.有数以万计的符号,以及相关的价格/大小,以每毫秒几千的速率流入系统.

需要在每个tick上进行的基本操作之一是字符串比较,以查看传入是否匹配我们感兴趣的符号.在如此高的频率下,这些字符串比较的优化可以使整个系统的性能产生可测量的差异.

我正在考虑生成符号字符串的哈希值,并将其与记录一起存储.对于后续比较,系统应使用此哈希(为int或long,比较应该是单个操作,而不是遍历字符串的每个字符,直到找到不匹配).

让我们忽略生成散列本身的成本(实际上,这可能实际上是禁止的).我能看到的唯一问题是,对于大量唯一符号,哈希冲突(两个单独的符号生成相同的哈希)将是毁灭性的.是否有一个散列算法可以保证匹配某些约束的字符串(例如字符数限制)是唯一的?

编辑:我将用Java编写此代码.不确定hashCode的(碰撞)质量或计算速度.

Jer*_*ell 12

也许散列函数不是最好的方法.如果您收到一个股票代码(而不是股票代码的散列),您将不得不每次计算它的哈希值.如果它的哈希算法没有冲突,那么无论如何你都需要查看符号的每个字符.所以你不妨直接比较一下这些角色.

我建议建立一个你感兴趣的所有代码的Trie数据结构.(参见http://en.wikipedia.org/wiki/Trie).遍历每个符号的树,如果到达股票代码的末尾而没有找到匹配,那么它不是一个有趣的股票代码.

使用散列,无论如何,您必须在有趣的代码的所有散列值集合中进行此遍历.


Mar*_*ler 5

常见的加密散列函数(如SHA-1)输出20个字节(160位).你的股票代码有多长?如果我们谈论的是像"WMT"(沃尔玛),"KO"(可口可乐)等那样的股票代码,那么它们似乎只有几个字节长 - 因此直接比较它们应该更快处理20字节哈希.你提到哈希冲突 - 我不担心它们,特别是当输入远小于哈希输出时.

您可以将字节转换为intlong依赖于编程语言和平台,然后在一个CPU指令中对这些"数字"进行比较.(我不知道现代编译器是否可以通过调用来快速比较一堆字节memcmp?)