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

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

我可以依靠 Go 的 `crypto/rand` 包給我唯一的隨機字符串嗎?

我可以依靠 Go 的 `crypto/rand` 包給我唯一的隨機字符串嗎?

Go
一只名叫tom的貓 2023-01-03 17:03:49
我想生成 32 個字符長的unique unguessable字母數字密鑰。密鑰將是我系統的標識符,將用于查找信息。在網上搜索時,我偶然發現crypto/rand了Go. 它能夠在下劃線系統調用的幫助下生成隨機字母數字。但我擔心crypto/rand包返回的值可能會產生一個非唯一的字符串。誰能澄清我是否可以依靠crypto/rand包裹來完成這項工作?
查看完整描述

3 回答

?
慕運維8079593

TA貢獻1876條經驗 獲得超5個贊

當然,對于隨機生成的令牌,始終存在生成重復令牌的可能性。有一些標準,例如UUID(不包括 v4)使用其他方法來嘗試“保證”每個標識符的唯一性。這些方法并沒有真正消除碰撞的可能性,它們只是改變了故障模式。例如,UUID1 依賴于MAC 地址的唯一性,這本身就是一個問題。

如果你不受令牌大小的限制,你可以很容易地選擇足夠多的比特,使得碰撞的概率變得如此之小,以至于與無數其他故障模式(例如程序員錯誤、宇宙射線、a大規模全球滅絕事件等)。

非常近似地,如果你有一個真正的 N 位隨機密鑰長度,你可以在有 50% 的機會看到沖突之前生成 2^(N/2) 個密鑰。有關更通用的公式,請參閱UUID#Collisions的維基百科頁面。


查看完整回答
反對 回復 2023-01-03
?
Smart貓小萌

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

我認為,對于這類事情,你應該使用UUID

package main


import (

    "fmt"

    "github.com/google/uuid"

)


func main() {

    id := uuid.New()

    fmt.Println(id.String())

}


查看完整回答
反對 回復 2023-01-03
?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

對于 crypto/rand,不能保證單個隨機數會多次出現。但是,發生這種情況的可能性非常低,并且對于您的用例來說可能已經足夠好了。在許多情況下,UUID 就足夠了。如果您對重復 UUID 的概率感到好奇,請參閱維基百科。

如果您真的需要真正的唯一性,您可能希望將隨機數與映射結合起來記錄它們,其中數字作為鍵,值是“無關”。在記錄數字時,可以檢測到重復項,并可以請求新的隨機數以防萬一。但是,這種方法可能會帶來新的挑戰,具體取決于您的設置,因為數字現在保存在本身不安全的內存中。如果您的用例無法確定系統生命周期內所需的機密數量,那么它在復雜性方面也將具有挑戰性。

對我來說,這實際上歸結為一個問題,即您用于信息查找的系統標識符是否真的是秘密,或者您只想要在系統中出現之前難以預測的唯一標識符。也許您可以詳細說明您的用例以闡明您的要求。


查看完整回答
反對 回復 2023-01-03
  • 3 回答
  • 0 關注
  • 354 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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