如何将专用字符串映射到指定的整数

时间:2015-05-17 16:17:43

标签: c++ hash low-latency algorithmic-trading

我正在做一些金融交易工作。我有一套股票符号,但它们有非常明确的模式: 它由两个字符ABAC AD和当前月份组成,这是一个四位数字:150315041505。一些例子是:

AB1504
AB1505
AC1504
AC1505
AD1504
AD1505
....

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

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

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

您可以在计算索引时始终对数字进行重新排序,以最大限度地减少上述问题。

由于这些数字实际上是几个月,我将计算从第一个条目开始的月数,并将其乘以前缀中的2位数字的基数为26的数字。

希望你能从中得到一些意义,此刻在我的平板电脑上打字。 :d

答案 2 :(得分:0)

以下值应由32位整数表示:

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

此处XY获取[0,26]范围内的值,n获取[0,10]范围内的值。

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

答案 3 :(得分: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位)。

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