簡體   English   中英

將10位數的char用戶ID分配給1000個服務器中的1個

[英]Assign 10-digit char user ids to 1 of 1000 servers

尋找分片數據庫,並根據他們的用戶ID將不同的用戶分配給不同的家庭服務器。 用戶ID是10個字符串,例如“ f4gKUKkj91” ...每個服務器的ID為1-1000。如何在php中創建哈希函數以唯一且一致地將每個用戶ID分配給特定的分片? 如果用戶ID是整數,則可以執行userid % 1000 ...,但是由於它們是字母數字,所以我不確定如何在php中均勻分配。

謝謝!

您可以使用crc32()為您提供字母數字用戶ID的數字哈希。

這不是一個完美的算法,因為對於較小的ID號會有一點偏愛。 可以這么說,它假設用戶ID分布均勻。 如果不是,則分布可能不好。

弄清楚您的字母是什么,並將其放在$str = '0123456789abcdefghijklmnopqrstuvwxxyzABCDEFGHIJKLMNOPQRSTUVXYZ';這樣的字符串中$str = '0123456789abcdefghijklmnopqrstuvwxxyzABCDEFGHIJKLMNOPQRSTUVXYZ'; 該字符串包含n個字符。 現在,我們基本上將用戶ID視為基數n整數。

對於每個字符,在字符串(從0開始)中找到其索引。 取該索引並乘以n x ,其中x是原始字符串中字符的位置,從0開始。將所有這些加在一起,然后求和。

您可能只想對幾個字符執行此操作-閱讀了幾個字符后,總和就變得很大,PHP不能正確處理它,除非您訴諸使用適合於大整數數學的函數(當然可以使用GMP之類的方法,但對於您的情況可能並不理想)。 如果使用本機整數,請在最大可能和超過2 ^ 31(n x + n x + 1 + ... + n)之前停止。

您可以使用從頭開始或后退(后退對應於通常的整數符號)。 其中一種可能更適合,具體取決於ID生成的工作方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM