gpt4 book ai didi

caching - 如何从多个键创建缓存键?

转载 作者:行者123 更新时间:2023-12-04 22:37:31 27 4
gpt4 key购买 nike

我有一个方法,我将缓存其输出。它需要四个参数; string , string , int , 和 WindowsIdentity .我需要根据这四个参数创建一个缓存键。是否最好:

将它们作为字符串连接在一起并使用该键?

var key = string.Concat(string1, string2, int1.ToString(), identity.ToString());

或者

异或他们的哈希码?
var key = string1.GetHashCode() ^ string2.GetHashCode() ^ int1.GetHashCode() ^ identity.GetHashCode();

或者是其他东西?有关系吗?在我的特殊情况下,这些键将进入 Hashtable (C# v1)。

最佳答案

创建一个封装四个值的新类型。例如:

public sealed class User
{
private readonly string name;
private readonly string login;
private readonly int points;
private readonly WindowsIdentity identity;

public User(string name, string login, int points,
WindowsIdentity identity)
{
this.name = name;
this.login = login;
this.points = points;
this.identity = identity;
}

public string Name { get { return name; } }
public string Login { get { return login; } }
public int Points { get { return points; } }
public WindowsIdentity Identity { get { return identity; } }

public override bool Equals(object other)
{
User otherUser = other as User;
if (otherUser == null)
{
return false;
}
return name == otherUser.name &&
login == otherUser.login &&
points == otherUser.points &&
identity.Equals(otherUser.identity);
}

public override int GetHashCode()
{
int hash = 17;
hash = hash * 31 + name.GetHashCode();
hash = hash * 31 + login.GetHashCode();
hash = hash * 31 + points.GetHashCode();
hash = hash * 31 + identity.GetHashCode();
return hash;
}
}

请注意,这假设 WindowsIdentity覆盖 EqualsGetHashCode适当 - 或者您对引用类型相等感到满意。

这种方法比您的任何一个建议都要健壮得多 - 例如,在您的第一种方法中,两个字符串对“xy”、“z”和“x”、“yz”最终会形成相同的缓存键(如果int 和 identity 是相同的)而它们不应该。第二种方法更有可能导致意外的哈希冲突。

关于caching - 如何从多个键创建缓存键?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3320294/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com