亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

分片/模組功能

分片/模組功能

嚕嚕噠 2022-06-14 15:01:27
假設我有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 在評論中指出的那樣,特定對象的哈希值只能保證在程序的同一運行中保持一致,因此如果您要求分布在多次運行中保持一致,則必須編寫您的自己的哈希函數,就像您在問題中所做的那樣。


查看完整回答
反對 回復 2022-06-14
?
人到中年有點甜

TA貢獻1895條經驗 獲得超7個贊

如果不進一步了解用于分片操作的鍵的結構和分布,散列函數是一種很好的方法。Python 標準庫在zlib模塊中提供了簡單的函數adler32crc32這些函數接受字節(實際上是任何帶有緩沖區接口的東西)并返回一個無符號的 32 位整數,然后可以對其進行模數以獲取機器號。

CRC 和 Adler 是快速算法,但文檔說“由于該算法是為用作校驗和算法而設計的,因此不適合用作一般哈希算法?!?nbsp;所以分布可能不是最優的(均勻的)。

加密哈希(速度較慢但分布更好)可通過hashlib模塊獲得。他們將摘要作為字節序列返回,可以將其轉換為整數int.from_bytes


查看完整回答
反對 回復 2022-06-14
  • 2 回答
  • 0 關注
  • 173 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號