Examples tested against actual runtime. CI re-verifies continuously. Only documented examples are tested.
How to use
Install via yarn add locutus and import:
import { sha1 } from 'locutus/php/strings/sha1'.
Or with CommonJS: const { sha1 } = require('locutus/php/strings/sha1')
Use a bundler that supports tree-shaking so you only ship the functions you actually use.
Vite,
webpack,
Rollup, and
Parcel
all handle this. For server-side use this is less of a concern.
Examples
These examples are extracted from test cases that automatically verify our functions against their native counterparts.
#
code
expected result
1
sha1('Kevin van Zonneveld')
'54916d2e62f65b3afa6e192e6a601cdbe5cb5897'
Notes
Keep in mind that in accordance with PHP, the whole string is buffered and then
hashed. If available, we’d recommend using Node’s native crypto modules directly
in a steaming fashion for faster and more efficient hashing
Here's what our current TypeScript equivalent to PHP's sha1 looks like.
import crypto from'crypto'
exportfunctionsha1(str: string): string { // discuss at: https://locutus.io/php/sha1/ // parity verified: PHP 8.3 // original by: Webtoolkit.info (https://www.webtoolkit.info/) // improved by: Michael White (https://getsprink.com) // improved by: Kevin van Zonneveld (https://kvz.io) // input by: Brett Zamir (https://brett-zamir.me) // note 1: Keep in mind that in accordance with PHP, the whole string is buffered and then // note 1: hashed. If available, we'd recommend using Node's native crypto modules directly // note 1: in a steaming fashion for faster and more efficient hashing // example 1: sha1('Kevin van Zonneveld') // returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897'
const _cvtHex = function (val: number): string { let str = '' let v = 0
for (let i = 7; i >= 0; i--) { v = (val >>> (i * 4)) & 0x0f str += v.toString(16) } return str }
let blockstart = 0 let j = 0 constW: number[] = newArray(80).fill(0) letH0 = 0x67452301 letH1 = 0xefcdab89 letH2 = 0x98badcfe letH3 = 0x10325476 letH4 = 0xc3d2e1f0 let A = 0 let B = 0 let C = 0 let D = 0 let E = 0 let temp = 0
for (blockstart = 0; blockstart < wordArray.length; blockstart += 16) { for (i = 0; i < 16; i++) { W[i] = wordArray[blockstart + i] ?? 0 } for (i = 16; i <= 79; i++) { W[i] = _rotLeft((W[i - 3] ?? 0) ^ (W[i - 8] ?? 0) ^ (W[i - 14] ?? 0) ^ (W[i - 16] ?? 0), 1) }
A = H0 B = H1 C = H2 D = H3 E = H4
for (i = 0; i <= 19; i++) { temp = (_rotLeft(A, 5) + ((B & C) | (~B & D)) + E + (W[i] ?? 0) + 0x5a827999) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
for (i = 20; i <= 39; i++) { temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + (W[i] ?? 0) + 0x6ed9eba1) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
for (i = 40; i <= 59; i++) { temp = (_rotLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + (W[i] ?? 0) + 0x8f1bbcdc) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
for (i = 60; i <= 79; i++) { temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + (W[i] ?? 0) + 0xca62c1d6) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
exportfunctionsha1(str) { // discuss at: https://locutus.io/php/sha1/ // parity verified: PHP 8.3 // original by: Webtoolkit.info (https://www.webtoolkit.info/) // improved by: Michael White (https://getsprink.com) // improved by: Kevin van Zonneveld (https://kvz.io) // input by: Brett Zamir (https://brett-zamir.me) // note 1: Keep in mind that in accordance with PHP, the whole string is buffered and then // note 1: hashed. If available, we'd recommend using Node's native crypto modules directly // note 1: in a steaming fashion for faster and more efficient hashing // example 1: sha1('Kevin van Zonneveld') // returns 1: '54916d2e62f65b3afa6e192e6a601cdbe5cb5897'
const _cvtHex = function (val) { let str = '' let v = 0
for (let i = 7; i >= 0; i--) { v = (val >>> (i * 4)) & 0x0f str += v.toString(16) } return str }
let blockstart = 0 let j = 0 const W = newArray(80).fill(0) letH0 = 0x67452301 letH1 = 0xefcdab89 letH2 = 0x98badcfe letH3 = 0x10325476 letH4 = 0xc3d2e1f0 let A = 0 let B = 0 let C = 0 let D = 0 let E = 0 let temp = 0
for (blockstart = 0; blockstart < wordArray.length; blockstart += 16) { for (i = 0; i < 16; i++) { W[i] = wordArray[blockstart + i] ?? 0 } for (i = 16; i <= 79; i++) { W[i] = _rotLeft((W[i - 3] ?? 0) ^ (W[i - 8] ?? 0) ^ (W[i - 14] ?? 0) ^ (W[i - 16] ?? 0), 1) }
A = H0 B = H1 C = H2 D = H3 E = H4
for (i = 0; i <= 19; i++) { temp = (_rotLeft(A, 5) + ((B & C) | (~B & D)) + E + (W[i] ?? 0) + 0x5a827999) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
for (i = 20; i <= 39; i++) { temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + (W[i] ?? 0) + 0x6ed9eba1) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
for (i = 40; i <= 59; i++) { temp = (_rotLeft(A, 5) + ((B & C) | (B & D) | (C & D)) + E + (W[i] ?? 0) + 0x8f1bbcdc) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
for (i = 60; i <= 79; i++) { temp = (_rotLeft(A, 5) + (B ^ C ^ D) + E + (W[i] ?? 0) + 0xca62c1d6) & 0x0ffffffff E = D D = C C = _rotLeft(B, 30) B = A A = temp }
Locutus is a community effort following
The McDonald's Theory:
we ship first iterations, hoping others will improve them.
If you see something that could be better, we'd love your contribution.