我一直在使用simhash算法。我根據我對爬蟲的理解來實現它。但是,當我做了一些測試時,對我來說似乎不太可靠。simhash功能可靠嗎?
我計算了200,000個不同文本數據的指紋,並看到一些不同的內容具有相同的指紋。所以碰撞的可能性很大。
我的實現代碼如下。
我的問題是:如果我的實現是正確的,這個算法有一個很大的衝突。谷歌如何使用這種算法?否則,我的算法有什麼問題?
public long CalculateSimHash(string input)
{
var vector = GenerateVector(input);
//5- Generate Fingerprint
long fingerprint = 0;
for (var i = 0; i < HashSize; i++)
{
if (vector[i] > 0)
{
var zz = Convert.ToInt64(1 << i);
fingerprint += Math.Abs(zz);
}
}
return fingerprint;
}
private int[] GenerateVector(string input)
{
//1- Tokenize input
ITokeniser tokeniser = new OverlappingStringTokeniser(2, 1);
var tokenizedValues = tokeniser.Tokenise(input);
//2- Hash values
var hashedValues = HashTokens(tokenizedValues);
//3- Prepare vector
var vector = new int[HashSize];
for (var i = 0; i < HashSize; i++)
{
vector[i] = 0;
}
//4- Fill vector according to bitsetof hash
foreach (var value in hashedValues)
{
for (var j = 0; j < HashSize; j++)
{
if (IsBitSet(value, j))
{
vector[j] += 1;
}
else
{
vector[j] -= 1;
}
}
}
return vector;
仰望生日問題。 –
生日問題?不能抱歉 – mavera
https://en.wikipedia.org/wiki/Birthday_problem –