Skip to content

dongle.Hash默认使用存在属性污染现象 #28

@cooppor

Description

@cooppor

在使用dongle.Hash默认实例时,我注意到当某处使用dongle.Hash时调用了WithKey方法,设置了Key值时,后续再次调用全局dongle.Hash默认实例时即使没有显式调用WithKey方法,实例依然保留之上次一的Key值设置,导致后续摘要结果与预期不一致问题出现。

测试用例

import (
	"crypto/md5"
	"fmt"
	"io"
	"testing"

	"github.com/dromara/dongle"
	"github.com/dromara/dongle/hash"
	"github.com/stretchr/testify/assert"
)

func TestMd5(t *testing.T) {
	var str = "1234567"

	// 原生md5
	h := md5.New()
	_, _ = io.WriteString(h, str)
	md5Std := fmt.Sprintf("%x", h.Sum(nil))
	// 初次使用dongle.Hash全局默认实例
	md5ByDongle1 := dongle.Hash.FromString(str).ByMd5().ToHexString()
	// 使用新建Hasher实例
	md5ByDongle2 := hash.NewHasher().FromString(str).ByMd5().ToHexString()
	// 全局默认实例,第二次使用,设置指定key
	md5ByDongle3 := dongle.Hash.FromString(str).WithKey([]byte("123456")).ByMd5().ToHexString()
	// 全局默认实例,第三次使用,没有显示指定key
	md5ByDongle4 := dongle.Hash.FromString(str).ByMd5().ToHexString()

	assert.Equalf(t, md5Std, md5ByDongle1, "1.默认全局无指定Key MD5结果应与原生结果一致")
	assert.Equalf(t, md5Std, md5ByDongle2, "2.新建实例无指定Key MD5结果应与原生结果一致")
	assert.Equalf(t, md5Std, md5ByDongle3, "3.默认全局指定Key MD5结果应与原生结果不一致")
	assert.Equalf(t, md5Std, md5ByDongle4, "4.默认全局无指定Key MD5结果应与原生结果一致")
}

输出结果为

=== RUN   TestMd5
    hash_test.go:33: 
        	Error Trace:	/xxxxxx/hash_test.go:33
        	Error:      	Not equal: 
        	            	expected: "fcea920f7412b5da7be0cf42b8c93759"
        	            	actual  : "172da6c624fdea57be1a3b79dbce3e20"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -1 +1 @@
        	            	-fcea920f7412b5da7be0cf42b8c93759
        	            	+172da6c624fdea57be1a3b79dbce3e20
        	Test:       	TestMd5
        	Messages:   	4.默认全局无指定Key MD5结果应与原生结果一致
--- FAIL: TestMd5 (0.00s)

预期:fcea920f7412b5da7be0cf42b8c93759
实际:172da6c624fdea57be1a3b79dbce3e20

建议:

  1. 既然是默认全局实例,使用便利的同时应该尽可能保持实例独立性不易被轻易污染,或在文档必要位置做必要的说明;
  2. 在默认实例调用末端方法或特定位置对实例的污染设定做清理处理
  3. 当然最好的情况应该是应该清楚这个现象的存在,自行决定如何使用才不会出现类似问题

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions