• 什麽是 Sqids?

    Sqids是一個小型的開源函式庫,可以從數字生成短、唯一、看起來隨機的識別碼 ID。

    最好的思考方式是將其視為十進制到十六進制的轉換器,但帶有一些額外的功能。

  • 用於縮短超連結,為日誌生成唯一事件識別碼 ID,為網站上的產品/對象生成識別碼 ID(就像YouTube為視頻所做的那樣),為文本消息生成短識別碼 ID,郵件確認代碼等。

  • 任何不敏感的數據。生成的識別碼 ID不是雜湊值,可以解碼恢復數字。例如,它們可能不是用戶識別碼 ID的好選擇,因為一旦解碼,它們可能會透露您應用的用戶數量。

  • 我可以同時編碼多個數字嗎?

    可以。Sqids可以將一個或多個非負數編碼為單個識別碼 ID。您可以編碼的數字數量沒有限制,但可以編碼的數字大小有限(取決於實作語言)。

    出於幾個原因很有用:您可以編碼UNIX時間戳並創建過期識別碼 ID,或者您可以將資料庫分片號與主鍵一起編碼,並節省額外的資料庫查詢。

  • 生成的識別碼 ID是唯一的嗎?

    是的,生成的識別碼 ID對於輸入和字母表是唯一的。

    請記住,預設字母表包含大寫和小寫字母,因此預設識別碼 ID是區分大小寫的。

  • Sqids 有什麽限制?

    Sqids無法編碼負數。

    最小字母表長度為3個字符。

    字母表不能包含任何多字節字符。

    Sqids不能生成特定長度的識別碼 ID,只能生成至少特定長度的識別碼 ID。最小長度參數範圍介於0和255之間。

    Sqids可以嘗試重新生成識別碼 ID,直到字母表長度減一。

  • 如何使我的識別碼 ID唯一?

    本函式庫接受自訂字母表,可以從中生成識別碼 ID。只需提供預先洗牌的預設字母表。

    請記住,如果付出足夠的努力,有人可能逆向工程出您的洗牌字母表,因此這絕不是隱藏敏感數據的技術。

  • 如何對預設字母表進行洗牌?

    預設字母表可以在此處 找到。

    您可以使用任何線上字符串洗牌工具或我們的體驗區

  • 使用較短或較長的字母表更好嗎?

    取決於您的案例。較短的字母表會生成較長的識別碼 ID,較長的字母表會生成較短的識別碼 ID。您可以使用體驗區 來測試您的識別碼 ID可能的案例。

  • 我的字母表可以只包含數字嗎?

    可以。請記住,生成的識別碼 ID仍然是字符串,可能以零開頭。

  • 我可以使用表情符號作為字母表嗎?

    不,Sqids不支持字母表中的多字節字符。這包括表情符號以及許多其他字符。

  • 為什麽要填充識別碼 ID?

    本函式庫可以使用無意義字符擴展識別碼 ID,使它們看起來更長。這很有用,這樣您就不會很明顯地編碼一個像1這樣的小數或1000000這樣的大數。

    解碼不受影響。

  • 我可以使生成的識別碼 ID更長嗎?

    是的,本函式庫接受最小長度參數,確保識別碼 ID至少具有該長度。

    請注意,對於識別碼 ID的長度沒有保證——只能確保它們不會短於您指定的長度。

  • 我可以將生成的識別碼 ID設置為特定長度嗎?

    只能到某個程度。

    設置最大長度是不可能的,因為隨著輸入的增大,您的識別碼 ID遲早會溢出。這就是為什麽只支持最小長度參數,而不支持確切長度或最大長度。

  • 為什麽要使用封鎖清單?

    封鎖清單可以防止某些詞彙出現在您的識別碼 ID中。這很有益,因為生成的識別碼 ID應該出現在公共場合,比如URL。

    Sqids附帶了包含幾種語言中最基本的髒話和不當詞彙的預設封鎖清單 。當然,您可以用您自己的詞彙擴展本封鎖清單。

  • 封鎖清單是如何工作的?

    封鎖清單單詞彙匹配不區分大小寫。

    長度少於3個字符的短詞將不被屏蔽。長度為3個字符的詞必須與識別碼 ID完全匹配。長度為4個字符或更長的詞,如果它們是識別碼 ID的子字符串,則會觸發匹配。

    如果封鎖清單中的詞彙包含數字(類似1337),它們只會在識別碼 ID的開頭或結尾時觸發匹配。

  • 預設封鎖清單中有哪些詞彙?

    預設的封鎖清單包含幾種語言中最常見的髒話和不當詞彙。您可以在此處 找到完整列表。

  • 當所有識別碼 ID都被阻止時會發生什麽?

    當生成的識別碼 ID與封鎖清單中的詞彙匹配時,函式庫會嘗試重新生成它。

    如果每一次嘗試重新生成識別碼 ID都失敗了,編碼函數將失敗並返回錯誤。該處理錯誤由用戶負責。

    減少重新生成嘗試次數的最佳方法是使用更長的字母表,不設置最小長度,並提供更小的封鎖清單。提供空封鎖清單將完全禁用本功能。

  • 如何檢查識別碼 ID是否有效?

    解碼識別碼 ID通常會產生某種數字輸出,但這並不一定意味著識別碼 ID是規範的。要檢查識別碼 ID是否有效,您可以重新對解碼後的數字進行編碼並檢查識別碼 ID是否匹配。

    之所以不自動完成這一步驟,是因為如果預設的封鎖清單在將來更改,我們不希望自動失效以前生成的識別碼 ID,而這些識別碼 ID可能現在匹配了新的封鎖清單詞彙。

  • 預設封鎖清單更新時會發生什麽?

    如果預設的封鎖清單更改,我們將確保更新CHANGELOG。

    您必須考慮到可能會有新詞彙加入預設的封鎖清單的情況。在這種情況下,重新對解碼後的數字進行編碼可能會產生不同的識別碼 ID。

    確保您的識別碼 ID在未來更新中保持一致的最佳方法是提供自訂的封鎖清單,即使它與當前預設的封鎖清單相同。

  • 編碼不同數字是否會產生相同的識別碼 ID ?

    不會,編碼不同的數字將產生唯一的識別碼 ID。

    然而,由於演算法設計的原因,解碼隨機識別碼 ID有時可能會產生相同的數字。檢查識別碼 ID是否規範的最佳方法是簡單地重新對解碼後的數字進行編碼並檢查識別碼 ID是否匹配。

  • 什麽是 Hashids?

    Hashids是本函式庫的第一個版本,大約在2013年發布。它也生成了短識別碼 ID,但使用了稍微不同的方法。

  • Hashids為何升級到Sqids?

    Hashids處理方式有所不同。

    它不支持自訂封鎖清單,而是依賴於最常見的英文髒話。它還使用了salt參數來洗牌字母表,這有點令人困惑,因為本函式庫與加密無關。此外,它使用了太多保留字符,導致生成的識別碼 ID更長。

    因此,我們決定升級和更名。演算法已經簡化,添加了一些功能,並且原始碼存儲庫現在全部集中在 一個地方

  • 為什麽移除了salt參數?

    salt參數被用來洗牌字母表,它絕不意味著與安全性或安全性相關聯。Hashids和Sqids都類似於十進制到十六進制轉換的工作方式,但進行了一些調整。沒有任何形式的加密,為了避免混淆,該參數已完全刪除。

  • Hashids與Sqids兼容嗎?

    不,Sqids擴展了Hashids的功能,並具有不同的設計目標和要求;因此,生成的識別碼 ID與Hashids不兼容。

  • 我如何安全地從Hashids升級到Sqids?

    由於Hashids和Sqids之間沒有兼容性,簡單地用Sqids替換Hashids是不可能的。

    不過,您可以通過區分哪個識別碼 ID屬於哪個函式庫來合併使用。

    其中一種方法是通過識別碼 ID長度 - 如果要切換到Sqids,您可以提供更高的最小長度。另一種方法是手動將自訂字符附加/添加到新生成的識別碼 ID。

    最後,您還可以嘗試使用Hashids解碼識別碼 ID,看看它是否有效。如果無效 - 使用Sqids解碼和重新編碼,看看是否有效。

  • 我在哪裏找到原始的Hashids函式庫?

    此網站上的每種語言實現都鏈接到原始的Hashids存儲庫(如果存在)。

  • 我如何貢獻?

    如果您想支持本項目,我們將感謝您在Github上給我們加星,以提高其能見度。

    如果您是開發人員,並且對某種特定程式語言沒有Sqids的實作,請幫助我們轉換本函式庫。同樣適用於未列出的程式語言。

    如果您發現規範或任何實現中存在錯誤,請在適當的存儲庫中創建問題或拉取請求,提出修正建議。

    如果您懂多種語言,若您發現存在任何問題,我們可以使用您的幫助來 優化封鎖清單 調整網站翻譯

    最後,如果您對Hashids/Sqids有一些經驗,請幫助引導我們的社區,回答任何人可能遇到的問題。

  • 如何將Sqids移植到另一種語言?

    如果您想要將Sqids移植到以下程式語言之一(或者沒有列出的新程式語言):

    ActionScript , D , Elm , Haxe , Io , PostgreSQL , Raku , Smalltalk , T-SQL , Tcl , VBA

    將官方存儲庫分叉到您自己的Github帳戶中,並實現 規格 以及所有測試。您可以重新使用任何現有的README文件(範例 )。

    一旦儲存庫準備就緒,請創建拉取請求。合併後,我們將更新網站。

    如果存儲庫沒有活躍的維護者,我們將很樂意邀請您管理該存儲庫並成為官方維護者。