假設我有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 是快速算法,但文檔說“由于該算法是為用作校驗和算法而設計的,因此不適合用作一般哈希算法?!?nbsp;所以分布可能不是最優的(均勻的)。
加密哈希(速度較慢但分布更好)可通過hashlib
模塊獲得。他們將摘要作為字節序列返回,可以將其轉換為整數int.from_bytes
。
添加回答
舉報
0/150
提交
取消