1

我正在使用一种算法,该算法可以索引已知固定大小(例如 64 位或 128 位)的任意大的无符号整数。我也希望能够将它应用于 utf-8 字符串,但为了做到这一点,我需要有一种可靠的方法来将任意长度的给定字符串映射到固定大小的无符号字节数组。至少保留字符串前缀的字典顺序的方式。

天真的方法是简单地获取字符串的第一个X字符并给每个字符一个完整的四个字节,根据需要在实际值前面加上零。但是,这将占用X * 4字节。我希望有一种方法可以更节省空间。

- - 编辑 - -

非常重要的是:发生碰撞是可以接受的。

使用上面描述的简单方法并给出字符串:

['Alabama', 'Alakazam', 'Alaska', 'Arkansas', 'Corduroy']

如果我们设置X为 3,“Alabama”、“Alaska”和“Alakazam”将发生冲突——映射只会产生三个唯一的 12 字节值(“Ala”的每个字符 4 字节表示、“方舟”和“Cor”)。但是,这三个值保持其字典顺序非常重要。

我们必须使用 4 个字节,因为(我相信)这是 utf-8 中单个字符可以占用的最大大小。为了保证我们的映射给我们一个固定大小的字节数组(至少在这个方案中),我们必须让通常只占用一个字节的 ASCII 字符最多占用四个字节。

'A' => 01100001,用零填充:00000000000000000000000001100001

'l' => 01101100,用零填充:00000000000000000000000001101100

'a' => 01100001,用零填充:00000000000000000000000001100001

因此,在X= 4 的示例中,任何以 'Ala' 开头的字符串都将映射到:

000000000000000000000000011000010000000000000000000000000110110000000000000000000000000001100001

当被视为 96 位无符号整数时,它的值将小于我们示例中其他前缀('Ark' 和 'Cor')的映射值,因此将满足映射保留我们的字典顺序的要求.

此方案有效,但将任何字符串的大小要求提高了 4 倍。希望是找到一种映射方案,以少于X * 4字节的方式完成 utf-8 前缀索引。

4

1 回答 1

3

令人高兴的是,事实证明 UTF-8 编码的字符串可以按字典顺序按原样排序

排序顺序:前导字节的选择值以及连续字节首先具有高位的事实意味着可以通过对相应的字节序列进行排序来按代码点顺序对 UTF-8 字符串列表进行排序。

通过将字符串的字节序列截断为固定长度的前缀,您可以实现上述问题中描述的内容。

于 2018-03-12T20:36:22.927 回答