我想在一个明确的清单中回答两个问题:
所以,我读过Redis列表实际上是用链表实现的.但对于其他类型,我无法挖掘任何信息.此外,如果有人偶然发现了这个问题并且没有对修改或访问不同数据结构的优缺点进行高级概述,那么他们就会有一个完整的列表,列出何时最好地使用特定类型来引用.
具体来说,我想概述所有类型:字符串,列表,集,zset和哈希.
哦,到目前为止,我已经看过这些文章,其中包括:
我正在尝试为字符串设想一个好的哈希函数.而且我认为总结字符串中前五个字符的unicode值可能是一个好主意(假设它有五个,否则在它结束时停止).这是一个好主意,还是一个坏主意?
我在Java中这样做,但我不认为这会产生很大的不同.
谁能告诉我为什么在DJB哈希函数中使用数字5381?
DJB Hash功能是
h(0)= 5381
h(i)= 33*h(i-1)^ str [i]
一个c程序:
unsigned int DJBHash(char* str, unsigned int len)
{
unsigned int hash = 5381;
unsigned int i = 0;
for(i = 0; i < len; str++, i++)
{
hash = ((hash << 5) + hash) + (*str);
}
return hash;
}
Run Code Online (Sandbox Code Playgroud) 我正在创建一个类似于a的结构String,除了它只处理Unicode UTF-32标量值.因此,它是一个数组UInt32.(有关更多背景,请参阅此问题.)
我希望能够将自定义ScalarString结构用作字典中的键.例如:
var suffixDictionary = [ScalarString: ScalarString]() // Unicode key, rendered glyph value
// populate dictionary
suffixDictionary[keyScalarString] = valueScalarString
// ...
// check if dictionary contains Unicode scalar string key
if let renderedSuffix = suffixDictionary[unicodeScalarString] {
// do something with value
}
Run Code Online (Sandbox Code Playgroud)
为此,ScalarString需要实现Hashable协议.我以为我可以这样做:
struct ScalarString: Hashable {
private var scalarArray: [UInt32] = []
var hashValue : Int {
get {
return self.scalarArray.hashValue // error
} …Run Code Online (Sandbox Code Playgroud) 我有很多英文单词,我想哈希.什么是良好的散列函数?到目前为止,我的散列函数将字母的ASCII值相加,然后以表格大小为模.我正在寻找一些有效而简单的东西.
知道为了获得两个对象的哈希码,通常的做法是对它们各自的哈希码进行XOR,我想检查一下Tuple如何处理其中的情况Item1 == Item2.这是我在源代码中找到的:
internal static int CombineHashCodes(int h1, int h2) {
return (((h1 << 5) + h1) ^ h2);
}
Run Code Online (Sandbox Code Playgroud)
我假设这是为了避免为所有相等的对象使用相同的哈希码,因为x ^ x = 0.为什么h1 << 5呢?这有什么特别的原因5吗?可能只是1?请帮我理解.