分片/模组功能

假设我有n机器,我需要在这些机器上尽可能均匀地分配数据。让我们使用5这个例子。我们拥有的数据将如下所示:


id        state           name              date

1         'DE'            'Aaron'           2014-01-01

要对 id 进行分片,我可以执行以下功能:


machine_num = id % n

要对字符串进行分片,我想最基本的方法是字符串到二进制到数字:


name_as_num = int(''.join(format(ord(i), 'b') for i in name), 2)

machine_num = name_as_num % n

或者更简单:


machine_num = ord(name[0]) % n

什么是如何对日期或时间戳进行分片的示例?与我在上面使用的那些相比,对字符串(甚至数字)字段进行分片的更好功能是什么?


噜噜哒
浏览 144回答 2
2回答

慕神8447489

由于散列函数旨在产生均匀分布的数字,因此您可以将散列函数用于您的目的:machine_num = hash(name) % n也适用于datetime对象:machine_num = hash(datetime(2019, 10, 2, 12, 0, 0)) % n但正如@jasonharper 在评论中指出的那样,特定对象的哈希值只能保证在程序的同一运行中保持一致,因此如果您要求分布在多次运行中保持一致,则必须编写您的自己的哈希函数,就像您在问题中所做的那样。

人到中年有点甜

如果不进一步了解用于分片操作的键的结构和分布,散列函数是一种很好的方法。Python 标准库在zlib模块中提供了简单的函数adler32,crc32这些函数接受字节(实际上是任何带有缓冲区接口的东西)并返回一个无符号的 32 位整数,然后可以对其进行模数以获取机器号。CRC 和 Adler 是快速算法,但文档说“由于该算法是为用作校验和算法而设计的,因此不适合用作一般哈希算法。” 所以分布可能不是最优的(均匀的)。加密哈希(速度较慢但分布更好)可通过hashlib模块获得。他们将摘要作为字节序列返回,可以将其转换为整数int.from_bytes。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python