R で SHA256 値を求める（おまけ付き）

使う機会少なすぎて、使いおうと思った時に思い出すこともできないのでメモです。

## 実行環境

- Ubuntu 16.04
- R 3.6.3

## RでSHA256

```R:RでSHA256
if (!require("openssl")) install.packages("openssl")
print(openssl::sha256("hello!"))
# -> [1] "ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b"

if (!require("openssl")) install.packages("openssl")
print(openssl::sha256("ハロ!"))
# -> [1] "3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42"

```

コマンドラインから実行する場合

```bash:コマンドラインから実行する場合
Rscript -e '
if (!require("openssl")) install.packages("openssl")
print(openssl::sha256("hello!"))
'
```

## その結果が本当に正しいかを確かめる
本当にあっているか不安…。この不安は異なる環境で結果が同じかどうかをチェックしないことには払拭できないと思ったので、調べてみたところ多くの場合でワンライナーで書けるくらい簡単だったのでメモです。

以下のなかから実行できそうなのを2つ3つくらい、日本語も含めて実行して同じ結果かをチェックしたら良いかなって。

### Linuxコマンド
```bash:SHA256のテスト（Linuxコマンド）
#echo+sha256sumを使う
echo -n "hello!" | sha256sum
# -> ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b  -

echo -n "ハロ!" | sha256sum
# -> 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42  -

#echo+opensslを使う
echo -n "hello!" | openssl sha256
# -> (stdin)= ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b

echo -n "ハロ!" | openssl sha256
# -> (stdin)= 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42
```

`echo` コマンドだと `-n` オプションを忘れちゃうことがあるので `printf`コマンドの方が良いかも。

```bash:printfでSHA256のテスト（Linuxコマンド）
printf "hello!" | sha256sum
# -> ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b  -

printf "ハロ!" | sha256sum
# -> 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42  -
```


### Node.js13.5
```javascript:SHA256のテスト（Node.js）
console.log(require("crypto").createHash("sha256").update("hello!").digest("hex"))
// -> ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b

console.log(require("crypto").createHash("sha256").update("ハロ!").digest("hex"))
// -> 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42
```

コマンドラインから実行する場合

```bash:コマンドラインから実行する場合
node -e '
console.log(require("crypto").createHash("sha256").update("hello!").digest("hex"))
'
```

### Python3.5
```python:SHA256のテスト（Python）
#3.5
print(__import__("hashlib").sha256("hello!".encode("utf-8")).hexdigest())
print(__import__("hashlib").sha256("ハロ!".encode("utf-8")).hexdigest())
```


コマンドラインから実行する場合

```bash:コマンドラインから実行する場合
python3 -c '
print(__import__("hashlib").sha256("hello!".encode("utf-8")).hexdigest())
'
```

### Ruby2.3
```ruby:SHA256のテスト（Ruby）
require "digest/sha2"
print Digest::SHA256.hexdigest("hello!")
# -> "ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b"

require "digest/sha2"
print Digest::SHA256.hexdigest("ハロ!")
# -> "3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42"

#または
require "openssl"
print OpenSSL::Digest::SHA256.hexdigest("hello!")
# -> "ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b"

require "openssl"
print OpenSSL::Digest::SHA256.hexdigest("ハロ!")
# -> "3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42"
```

コマンドラインから実行する場合

```bash:コマンドラインから実行する場合
ruby -e '
require "openssl"
print OpenSSL::Digest::SHA256.hexdigest("hello!")
'
```


### Perl5
```perl:SHA256のテスト（Perl）
use Digest::SHA qw(sha256_hex);
print sha256_hex("hello!");
# -> ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b

use Digest::SHA qw(sha256_hex);
print sha256_hex("ハロ!");
# -> 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42
```

コマンドラインから実行する場合

```bash:コマンドラインから実行する場合
perl -e '
use Digest::SHA qw(sha256_hex);
print sha256_hex("hello!");
'
```

### JavaScript
```js:SHA256のテスト（JavaScript）
/*
  https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest から引用
*/
async function digestMessage(message) {
  const msgUint8 = new TextEncoder().encode(message);
  const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8);
  const hashArray = Array.from(new Uint8Array(hashBuffer));
  const hashHex = hashArray.map(b=>b.toString(16).padStart(2, '0')).join('');
  return hashHex;
}

console.log(await digestMessage("hello!"))
// -> ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b

console.log(await digestMessage("ハロ!"))
// -> 3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42

//mapでまとめて実行したいとき
let target = ["hello!", "ハロ!"];
console.log(await Promise.all(target.map(s=>digestMessage(s))))
// -> [
"ce06092fb948d9ffac7d1a376e404b26b7575bcc11ee05a4615fef4fec3a308b",
"3564dcbd2cb0145ebf4a2f1219f9354a4c91936f0bdfe545bbc5140bcd7bba42"
]

```