假设我有n机器,我需要在这些机器上尽可能均匀地分配数据。让我们使用5这个例子。我们拥有的数据将如下所示:id state name date1 '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什么是如何对日期或时间戳进行分片的示例?与我在上面使用的那些相比,对字符串(甚至数字)字段进行分片的更好功能是什么?
2 回答
慕神8447489
TA贡献1780条经验 获得超1个赞
由于散列函数旨在产生均匀分布的数字,因此您可以将散列函数用于您的目的:
machine_num = hash(name) % n
也适用于datetime
对象:
machine_num = hash(datetime(2019, 10, 2, 12, 0, 0)) % n
但正如@jasonharper 在评论中指出的那样,特定对象的哈希值只能保证在程序的同一运行中保持一致,因此如果您要求分布在多次运行中保持一致,则必须编写您的自己的哈希函数,就像您在问题中所做的那样。
人到中年有点甜
TA贡献1895条经验 获得超7个赞
如果不进一步了解用于分片操作的键的结构和分布,散列函数是一种很好的方法。Python 标准库在zlib
模块中提供了简单的函数adler32
,crc32
这些函数接受字节(实际上是任何带有缓冲区接口的东西)并返回一个无符号的 32 位整数,然后可以对其进行模数以获取机器号。
CRC 和 Adler 是快速算法,但文档说“由于该算法是为用作校验和算法而设计的,因此不适合用作一般哈希算法。” 所以分布可能不是最优的(均匀的)。
加密哈希(速度较慢但分布更好)可通过hashlib
模块获得。他们将摘要作为字节序列返回,可以将其转换为整数int.from_bytes
。
添加回答
举报
0/150
提交
取消