SHA1 hashing in SQLite: how?

这一生的挚爱 提交于 2019-11-27 14:51:26
kennytm

There is no such function built into SQLite3.

But you could define a user function e.g. with sqlite3_create_function if you're using the C interface, and implement SHA-1 with that. (But if you're having a programmable interface perhaps you could just SHA-1 the password outside of the SQL engine.)

You could also try to find / create an extension and load with the load_extension function, but I don't have experience on that.

Edit:

SQLite does not come with SHA1, but it is relatively easily to add. You didn't say what language, you're using, but you can look at the C documentation for create_function and sqlite3_result. You can also take a look at this example of how to add SHA1 to SQLite using Ruby.

With System.Data.SQLite, they're called user-defined functions. You can look at this example on the main site.

You can create a custom function for SHA1 in C# like this:

[SQLiteFunction(Name = "Sha1", Arguments = 1, FuncType = FunctionType.Scalar)]
public class Sha1 : SQLiteFunction
{
    public override object Invoke(object[] args)
    {
        var buffer = args[0] as byte[];

        if ( buffer == null )
        {
            var s = args[0] as string;

            if ( s != null )
                buffer = Encoding.Unicode.GetBytes(s);
        }

        if ( buffer == null )
            return null;

        using ( var sha1 = SHA1.Create() )
        {
            return sha1.ComputeHash(buffer);
        }
    }
}

This function can be called for binary data or strings. Strings are hashed in their Unicode representation. This should match SQL Server.

The function can be called like this:

select sha1('abc')
select sha1(x'010203')

As far as I know, SQLite doesn't have any hashing functions built-in.

There is a way to add custom functions to SQLite, but it's probably easier if you just calculate the SHA1 hash in your program and store it in SQlite.

Creating custom functions for SQLite depends somewhat on the API and the language you're using. I only have experience with creating SQLite functions from Python.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!