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

how to map a specialized string into specified integer

本文关键字:整数 映射 专门化 字符串      更新时间:2023-10-16

我在做一些金融交易的工作。我有一套股票代码,但它们有非常清晰的图案:它由两个字符AB, AC, AD和当前月份组成,这是一个四位数字:1503, 1504, 1505。例如:

AB1504
AB1505
AC1504
AC1505
AD1504
AD1505
....

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

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

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;

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

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

此处XY取值范围为[0,26),n取值范围为[0,10)。

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

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

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

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

希望你能从我的平板电脑上打字的这一刻得到一些意义。: D

我假设格式为'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表示,mm是相对于某一年中的某个零月份的月份(涵盖2^32/1024/12 = 349525年-有32位)。

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