在golang中使用UUID生成唯一文件名

时间:2015-08-28 17:37:28

标签: go uuid

我需要使用UUID1生成一个唯一的文件名。

我目前的python代码是:

uuid.uuid1().hex[:16] // i need 16 chars file name

什么可能是golang等价物?

谢谢!

2 个答案:

答案 0 :(得分:4)

Go的标准库中没有guid或uuid类型,但还有其他一些方法可以实现,比如使用像这样的第三方软件包; https://godoc.org/code.google.com/p/go-uuid/uuidhttps://github.com/nu7hatch/gouuid

import "github.com/nu7hatch/gouuid"

id, err := uuid.NewV4()

这个答案还有另一种选择,它使用Unix命令行工具; Is there a method to generate a UUID with go language虽然它似乎表现不佳。

答案 1 :(得分:2)

我相信你的问题陈述中的阻抗不匹配,你的Python代码不会像预期的那样工作。

可以通过“ Is there a method to generate a UUID with go language ”中的一些答案推断,以及https://en.wikipedia.org/wiki/Universally_unique_identifier#Version_1_(date-time_and_MAC_address)中明确说明的 UUID 很可能只有在完全拍摄时才有特色,而不是部分拍摄,并且根本不一定是随机的,特别是版本1实际上是可预测的,因为它基于日期/时间和生成它的主机的MAC地址。

因此,最好的方法可能是使用与answers to the prior mentioned question之一中的代码类似的内容,实际根据您自己的规范生成基于crypto/rand的随机文件名,而不使用滥用图书馆并不一定意味着为手头的任务提供所需的随机性。

https://play.golang.org/p/k2V-Mc5Y31e

package main

import (
    "crypto/rand"
    "fmt"
)

func random_filename_16_char() (s string, err error) {
    b := make([]byte, 8)
    _, err = rand.Read(b)
    if err != nil {
        return
    }
    s = fmt.Sprintf("%x", b)
    return
}

func main() {
    s, _ := random_filename_16_char()
    fmt.Println(s)
}