全局唯一的Session ID如何创建?

keke · 2013-03-20 12:48:43 · 12403 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2013-03-20 12:48:43 的主题,其中的信息可能已经有所发展或是发生改变。

go net/http包没有官方session实现,只有cookie。可是有时候保存在session更安全放心,所以还必须自己实现。可是如何创建session id呢?怎么保证这个id是唯一的?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

12403 次点击  
加入收藏 微博
5 回复  |  直到 2016-03-30 06:24:30
polaris
polaris · #1 · 12年之前

可以这样考虑(供参考):

获取当前时间的纳秒数time.Now().UnixNano(), 然后产生一个随机数字, 把随机数字和当前时间相加后加密一下(md5)。

package main

import (
    "fmt"
    "time"
    "math/rand"
    "crypto/md5"
    "strconv"
    "io"
)

func main() {
    nano := time.Now().UnixNano()
    rand.Seed(nano)
    rndNum := rand.Int63()
    sessionId := Md5(Md5(strconv.FormatInt(nano, 10))+Md5(strconv.FormatInt(rndNum, 10)))
    fmt.Println(sessionId)
}

func Md5(text string) string {
    hashMd5 := md5.New()
    io.WriteString(hashMd5, text)
    return fmt.Sprintf("%x", hashMd5.Sum(nil))
}

到play.golang.org运行: http://play.golang.org/p/IMSclrRieJ

keke
keke · #2 · 12年之前

谢谢!纳秒数做种子,取随机数,一定是唯一了吧?不管并发是多高

polaris
polaris · #3 · 12年之前

应该可以保证

jimmykuu
jimmykuu · #4 · 12年之前

推荐一个uuid的包code.google.com/p/go-uuid/uuid

ggjjlldd
ggjjlldd · #5 · 9年之前

这个算法只能保证一台服务器唯一,多台服务器不唯一

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传