我正在项目中使用自定义的Metaphone Sqlite函数。这是该函数的链接:
https://github.com/geocommons/geocoder/blob/master/src/libsqlite3_geocoder/metaphon.c
当我在 32 位 Ubuntu 上运行该函数时,执行如下操作:
$ sqlite3
SQLite version 3.7.17 2013-05-20 00:56:22
sqlite> .load ./libsqlite3_geocoder.so
sqlite> select metaphone('hitchcock');
XKK
如您所见,该函数返回了无效结果(正确的结果是 HXKK
)。在 64 位 Ubuntu 上,不会发生此错误。
奇怪的是,如果我将此函数编译为独立的 C 程序(删除所有 Sqlite 内容),它在 32 位操作系统上也可以正常工作。
任何想法可能是什么原因以及如何解决它?
注意:如果你想自己尝试一下,只需从Github获取代码,在src/libsqlite3_geocoder
目录中运行make
,.so
应该构建。不过,你需要sqlite3开发库来编译它。
找到了。metaphone()
函数中有一个错误,它一度检查给定字符串边界之外的字符,这显然在不同情况下返回不同的值(不确定这与操作系统是 32 位还是 64 位有关):
case 'H':
if (!varson(*(n - 1)) && (!vowel(*(n - 1)) || // see that "n - 1" here!
vowel(*(n + 1))))
{
*Metaph++ = 'H';
}
break;