|  | @@ -6,6 +6,7 @@ import (
 | 
	
		
			
				|  |  |  	"crypto/rand"
 | 
	
		
			
				|  |  |  	"encoding/hex"
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +	"v2ray.com/core/common"
 | 
	
		
			
				|  |  |  	"v2ray.com/core/common/errors"
 | 
	
		
			
				|  |  |  )
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -46,11 +47,11 @@ func (u *UUID) Equals(another *UUID) bool {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // Next generates a deterministic random UUID based on this UUID.
 | 
	
		
			
				|  |  | -func (u *UUID) Next() *UUID {
 | 
	
		
			
				|  |  | +func (u *UUID) Next() UUID {
 | 
	
		
			
				|  |  |  	md5hash := md5.New()
 | 
	
		
			
				|  |  |  	md5hash.Write(u.Bytes())
 | 
	
		
			
				|  |  |  	md5hash.Write([]byte("16167dc8-16b6-4e6d-b8bb-65dd68113a81"))
 | 
	
		
			
				|  |  | -	newid := new(UUID)
 | 
	
		
			
				|  |  | +	var newid UUID
 | 
	
		
			
				|  |  |  	for {
 | 
	
		
			
				|  |  |  		md5hash.Sum(newid[:0])
 | 
	
		
			
				|  |  |  		if !newid.Equals(u) {
 | 
	
	
		
			
				|  | @@ -61,30 +62,31 @@ func (u *UUID) Next() *UUID {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // New creates an UUID with random value.
 | 
	
		
			
				|  |  | -func New() *UUID {
 | 
	
		
			
				|  |  | -	uuid := new(UUID)
 | 
	
		
			
				|  |  | -	rand.Read(uuid.Bytes())
 | 
	
		
			
				|  |  | +func New() UUID {
 | 
	
		
			
				|  |  | +	var uuid UUID
 | 
	
		
			
				|  |  | +	common.Must2(rand.Read(uuid.Bytes()))
 | 
	
		
			
				|  |  |  	return uuid
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // ParseBytes converts an UUID in byte form to object.
 | 
	
		
			
				|  |  | -func ParseBytes(b []byte) (*UUID, error) {
 | 
	
		
			
				|  |  | +func ParseBytes(b []byte) (UUID, error) {
 | 
	
		
			
				|  |  | +	var uuid UUID
 | 
	
		
			
				|  |  |  	if len(b) != 16 {
 | 
	
		
			
				|  |  | -		return nil, errors.New("invalid UUID: ", b)
 | 
	
		
			
				|  |  | +		return uuid, errors.New("invalid UUID: ", b)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  | -	uuid := new(UUID)
 | 
	
		
			
				|  |  |  	copy(uuid[:], b)
 | 
	
		
			
				|  |  |  	return uuid, nil
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  // ParseString converts an UUID in string form to object.
 | 
	
		
			
				|  |  | -func ParseString(str string) (*UUID, error) {
 | 
	
		
			
				|  |  | +func ParseString(str string) (UUID, error) {
 | 
	
		
			
				|  |  | +	var uuid UUID
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  	text := []byte(str)
 | 
	
		
			
				|  |  |  	if len(text) < 32 {
 | 
	
		
			
				|  |  | -		return nil, errors.New("invalid UUID: ", str)
 | 
	
		
			
				|  |  | +		return uuid, errors.New("invalid UUID: ", str)
 | 
	
		
			
				|  |  |  	}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -	uuid := new(UUID)
 | 
	
		
			
				|  |  |  	b := uuid.Bytes()
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  	for _, byteGroup := range byteGroups {
 | 
	
	
		
			
				|  | @@ -95,7 +97,7 @@ func ParseString(str string) (*UUID, error) {
 | 
	
		
			
				|  |  |  		_, err := hex.Decode(b[:byteGroup/2], text[:byteGroup])
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		if err != nil {
 | 
	
		
			
				|  |  | -			return nil, err
 | 
	
		
			
				|  |  | +			return uuid, err
 | 
	
		
			
				|  |  |  		}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  		text = text[byteGroup:]
 |