6

我正在做一些金融交易工作。我有一组股票代码,但它们的模式非常清晰:它由两个字符组成ABAC AD当前月份是一个四位数字:1503, 1504, 1505。一些例子是:

AB1504
AB1505
AC1504
AC1505
AD1504
AD1505
....

由于这些字符串的模式设计得非常好,我想将每个字符串映射(散列)成一个唯一的整数,以便我可以使用该整数作为数组索引进行快速访问,因为我的系统中有很多检索和std::unordered_map或任何其他哈希映射都不够快。我的测试表明,一般的哈希映射是一百纳秒的延迟级别,而数组索引总是低于 100 纳秒。我的理想情况是,例如,AB1504映射到 integer 1AB1505 映射到2....,然后我可以在里面创建一个数组来更快地访问与这些符号相关的信息。我正在尝试找出一些可以实现我的目标但无法找到的哈希算法或其他方法。你们对这个问题有什么建议吗?

4

4 回答 4

1

您可以将字符串视为可变基数表示,并将其转换为整数。例如:

AC1504:
A (range: A-Z)
C (range: A-Z)
15 (range: 0-99)
04 (range: 1-12)

提取零件;那么哈希函数可以是

int part1, part2, part3, part4;
...
part1 -= 'A';
part2 -= 'A';
part4 -= 1;
return (((part1 * 26 + part2) * 100 + part3) * 12 + part4;
于 2015-05-17T16:31:47.887 回答
0

如果将字符串解析为混合基数,前 2 个基数为 26 的数字,然后是 4 个基数为 10 的数字,您将很快获得每个字符串的唯一索引。唯一的问题是,如果你可能得到一个稀疏的数组。

在计算索引时,您始终可以对数字重新排序,以尽量减少上述问题。

由于数字实际上是月数,我会从第一个条目计算月数,并将其与前缀中的 2 位 base-26 数字相乘。

希望你能从中有所了解,此刻在我的平板电脑上打字。:D

于 2015-05-17T16:29:52.820 回答
0

以下值应该可以用 32 位整数表示:

XYnnnn => (26 * X + Y) * 10000 + nnnn

这里取值范围为 [0, 26),X取值范围为 [0, 10)。Yn

您总共有 6,760,000 个可表示的值,因此如果您只想将少量数据与其关联(例如计数或指针),您可以制作一个平面数组,其中每个符号占用一个数组条目。

于 2015-05-17T16:30:13.330 回答
0

我假设格式是“AAyymm”,其中 A 是大写字符 yy 是两位数的年份,mm 是两位数的月份。

因此,您可以将其映射到 10 (AA) + Y (yy) + 4 (mm) 位。其中 Y = 32 - 10 - 4 = 18 位,用于 32 位表示(或 262144 年)。有了这个,您可以通过将字符移到那里并将年份和月份对转换为整数后将它们移到那里来将格式表示为整数。

注意:二进制表示中总会有间隙,这里是字符的 5+5 位表示(6 + 6 个值)和 4 位月份表示(4 个值)

为避免间隙将表示更改为 ABmmmm,AB 对是否由数字 26*A+B 表示,而 mmmm 是相对于某年某个零月的月份(涵盖 2^32/1024/12 = 349525年 - 有 32 位)。

但是,您可能会考虑拆分股票代码和时间。在一个字段中组合两个值通常很麻烦(它可能是一种好的存储格式,但不是好的“程序数据格式”)。

于 2015-05-17T17:46:28.097 回答