C# 如何从用作表键的长字符串中生成唯一值?

C# 如何从用作表键的长字符串中生成唯一值?,c#,sql-server,database,sqlite,C#,Sql Server,Database,Sqlite,我想使用文件路径作为数据库表中的键。但使用长字符串作为键并不是一种有效的方法 所以我想了一些方法来减小路径的大小。看起来很棒,特别是当它返回int时 var key = path.GetHashCode(); 但文件中写道: 散列代码旨在有效地在中插入和查找 基于哈希表的集合。哈希代码不是一个 永久价值。因此: 不要序列化哈希代码值或将其存储在数据库中 不要使用哈希代码作为键从键控集合检索对象 那么,如何缩短用作数据库表键的路径字符串呢?不要这样做。您可以使用相当长的字符串作为基于查找的结

我想使用文件路径作为数据库表中的键。但使用长字符串作为键并不是一种有效的方法

所以我想了一些方法来减小路径的大小。看起来很棒,特别是当它返回
int

var key = path.GetHashCode();
但文件中写道:

散列代码旨在有效地在中插入和查找 基于哈希表的集合。哈希代码不是一个 永久价值。因此:

  • 不要序列化哈希代码值或将其存储在数据库中
  • 不要使用哈希代码作为键从键控集合检索对象

那么,如何缩短用作数据库表键的路径字符串呢?

不要这样做。您可以使用相当长的字符串作为基于查找的结构的键,而不会出现实际问题。基于散列或排序数据结构的整个设计是为了避免在搜索结构时实际比较大量对象


如果您使用某些东西来“缩短”字符串,那么您有两个选项,假设所有缩短的字符串实际上都是唯一的,这意味着如果发生冲突,您的代码将无法正常工作,或者跟踪实际字符串和缩短的字符串,并使用实际字符串来处理冲突。后者正是类似于
字典的东西对其所有键所做的,而数据库索引将做一些类似的事情,因此您没有理由重新实现它。

不要这样做。您可以使用相当长的字符串作为基于查找的结构的键,而不会出现实际问题。基于散列或排序数据结构的整个设计是为了避免在搜索结构时实际比较大量对象


如果您使用某些东西来“缩短”字符串,那么您有两个选项,假设所有缩短的字符串实际上都是唯一的,这意味着如果发生冲突,您的代码将无法正常工作,或者跟踪实际字符串和缩短的字符串,并使用实际字符串来处理冲突。后者正是类似于
字典的东西对其所有键所做的,而数据库索引将做一些类似的事情,因此您没有理由重新实现它。

使用标识列创建代理键。您仍然可以对文件路径编制索引或设置唯一约束。

使用标识列创建代理项。您仍然可以在文件路径上建立索引或设置唯一约束。

为什么不使用
Guid
?此表中的数据类型是什么?它需要与其他表建立关系吗?@BenRobinson我使用的是SQLite,速度不太快。其他表也依赖于文件路径,因此我希望通过使用path作为键来减少访问数据库的次数。为什么不使用
Guid
?此表中包含什么类型的数据?它需要与其他表建立关系吗?@BenRobinson我使用的是SQLite,速度不太快。其他表也依赖于文件路径,因此我希望通过使用路径keydreach@Servy来减少访问数据库的次数。我将使用路径作为键,并查看输入的内容:)。。我认为这是合理的,因为行数只有几千行。谢谢@Servy。我将使用路径作为键,并查看输入的内容:)。。我认为这是合理的,因为排数只有几千排。