-
Notifications
You must be signed in to change notification settings - Fork 72
Open
Description
在使用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
建议:
- 既然是默认全局实例,使用便利的同时应该尽可能保持实例独立性不易被轻易污染,或在文档必要位置做必要的说明;
- 在默认实例调用末端方法或特定位置对实例的污染设定做清理处理
- 当然最好的情况应该是应该清楚这个现象的存在,自行决定如何使用才不会出现类似问题
Metadata
Metadata
Assignees
Labels
No labels