2017-12-06 11 views
-1

セミランダムなスラッグを作るために、私はuuidの最初の8文字を使いたいと思います。だから私はgolangでuuidをカットする方法は?

import (
    fmt 
    "github.com/satori/go.uuid" 
) 

    u1 := uuid.NewV4() 
    fmt.Println("u1 :", u1) 

    runes := []rune(u1) 
    slug := string(runes[0:7]) 

を持っている。しかし、コンパイル時に私はこのエラーを取得する:

cannot convert u1 (type uuid.UUID) to type []rune

は、私はそれを修正できますか?

+1

なぜ[[] rune'に変換しようとしていますか? UUIDには、文字列表現の16進文字のみを含めることができます。なぜ 'String()'メソッドを使うだけではないのですか? – JimB

+0

@JimB、私は行くのnoobです、そして、それは私が特定の長さに文字列をカットするために見つけたスニペットです。コード例を使用して完全な答えを評価してください。 – Karlom

+1

あなたは基本的なドキュメンテーションから始めるべきでしょう。おそらく、[Tour of Go](https://tour.golang.org)を実行する必要があります。まれにしかうまくいかない理由を知らずに切削&貼り付け。 – JimB

答えて

3

(私はソースコードを見て)UUIDは[16]byteの別名であるので、あなたは、あなたがしたいことをルーン配列、ではないのコンサート、それをすることはできません。

はこれを試してみてください:

s := hex.EncodeToString(u1.Bytes()[:4]) 

これはあなたの8桁の16進数得られます。しかし、これはまだ物事を行うラウンドアバウトの方法です。 v4 UUIDは特定のビットを除いてランダムです。したがって、UUID全体を使用していない場合は、4つのランダムバイトを生成する方が簡単です。 math/rand(シードする必要があります)またはcrypto/rand(これはUUIDライブラリが使用するものです)のRead()関数を使用してください。

b := make([]byte, 4) 
rand.Read(b) // Doesn’t actually fail 
s := hex.EncodeToString(b) 
+0

あなたはどちらがよりランダムな結果をもたらすか? 'hex.EncodeToString(u1.Bytes()[:4])'または 'make([] byte、4)'? – Karlom

+0

@Karlom: 'make([] byte、4)'はランダムではありません。ランダムなデータを入れなければなりません。 – JimB

+2

これらはどちらも一様にランダムです。しかし、UUIDを使用すると、余分なランダムビットを生成しているので、それらを捨てることができます。 UUIDを捨てるだけの理由は何ですか? –

4

UUID[]runeに変換する必要はありません。そのUUIDタイプは、[16]byteとしてバイナリ表現で格納されます。 UUID.String()メソッドがあり、これを使用して文字列に変換してからスライスすることができます。そのパッケージには

slug := u1.String()[:7] 
+0

8文字以上を要求する場合、これにはダッシュが含まれています。 –

+0

@DietrichEpp:trueですが、文字列形式が仕様の一部であるUUIDを具体的にスライスしているので、意図したものとみなしました。それ以外の場合は、UUIDを使用する理由 – JimB

+0

@DietrichEpp、そうですね、彼らは「ランダム性」のためにしか望んでいませんでした – JimB

関連する問題