- 技術 💻
シグネチャーとは|意味をIT・ビジネス別に解説(メール署名・関数・ファイル)
結論
シグネチャー(signature)とは、「署名」と、そこから広がった「そのものを見分けるしるし・特徴」を表す言葉です。メールでは末尾の署名、プログラミングでは関数の名前と引数の並び、ファイルでは形式を示す先頭の数バイトを指します。
この記事でわかること
- メール・プログラミング・ファイルなど分野別の意味の一覧
- Java・TypeScript・Python・Go で戻り値や例外を含むかの違い
- PNG・PDF・ZIP・JPEG の先頭バイトを xxd と file で見た結果
この記事で実際に動かしたもの:4つの言語で「同じ名前の関数を2つ書く」コードのコンパイルと実行、Python の inspect.signature、7種類のファイルに対する xxd と file、OpenSSL での署名と検証です。
シグネチャーという言葉は、どの分野でも「これが誰の(何の)ものかを見分けるしるし」という芯が共通しています。
flowchart LR
S[シグネチャー<br>署名・見分けるしるし] --> A[メールの署名<br>送り主が誰か]
S --> B[関数のシグネチャ<br>どう呼ぶ関数か]
S --> C[ファイルシグネチャ<br>何の形式か]
S --> D[電子署名<br>誰が作り変更が無いか]
よく調べられることの答えを先にまとめます。
| 知りたいこと | 答え | 詳しい節 |
|---|---|---|
| シグネチャーとは | 署名。転じて「見分けるしるし・特徴」 | 意味と語源 |
| シグネチャーの意味(メール) | 本文の末尾に付ける氏名・所属・連絡先 | メールのシグネチャー |
| 関数・メソッドのシグネチャとは | 名前と引数の並び。戻り値を含むかは言語で違う | プログラミングのシグネチャ |
| Java で戻り値はシグネチャに入るか | 入らない。throws も入らない | Javaのメソッドシグネチャ |
| inspect.signature の使い方 | 関数を渡すと引数と戻り値の注釈を返す | Pythonのシグネチャ |
| ファイルシグネチャとは | 形式を示す先頭の数バイト(マジックナンバー) | ファイルシグネチャ |
| 拡張子を変えたら形式は変わるか | 変わらない。file コマンドは中身で判定する | 拡張子を変えても |
| 電子署名との違い | 電子署名は作成者と内容の変更を確かめる仕組み | 電子署名との違い |
| シグネチャーメニューの意味 | その店・ブランドを代表する看板の一品 | 分野別の意味 |
確認環境:Ubuntu 24.04.5 LTS の上で、OpenJDK 21.0.12(javac・java・javap)、TypeScript 7.0.2(tsc、Node.js 22.23.4 で実行)、Python 3.13.18(inspect・functools・mimetypes、画像の作成に Pillow 12.3.0)、Go 1.24.7、file 5.45、xxd(Vim 9.1 に付属の版)、OpenSSL 3.0.13 を使い、記事中のコード・コマンドをすべて手元で実行して出力を貼りました。サンプルのファイル(PNG・JPEG・GIF・PDF・ZIP・docx・テキスト)は自分で作ったものです。言葉の意味はデジタル大辞泉と Merriam-Webster、言語ごとのシグネチャの範囲は Java 言語仕様(Java SE 21)・Java 仮想マシン仕様・TypeScript Handbook・Python 公式ドキュメント・Go 言語仕様、ファイルの先頭バイトは W3C の PNG 仕様と PKWARE の ZIP 仕様(APPNOTE)、メールの署名の設定は Gmail ヘルプと Microsoft サポート、電子署名はデジタル庁のページで確かめました。PDF・JPEG・GIF の先頭バイトは手元の xxd と file の出力で確かめています。スマートフォンのメールアプリの画面は手元で確かめていないため、手順を載せていません。xxd はシステムに入っていなかったため、Ubuntu のパッケージ(.deb)を作業用のフォルダーに展開して使いました。図は mermaid-cli 11.16.0 で描画を確かめています(確認日 2026年11月11日)。
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「シグネチャーとは|意味をIT・ビジネス別に解説(メール署名・関数・ファイル)」
シグネチャーとは:意味と語源
この節では、シグネチャーという言葉の辞書での意味と、なぜ分野ごとに違うものを指すのかが分かります。
シグネチャーは英語の signature をカタカナにした言葉で、もとの意味は「署名」です。 デジタル大辞泉は、次のように説明しています。
《「シグニチャー」とも》署名。特に、電子メールに付される送信者の氏名や所属、連絡先など。
英語の辞書 Merriam-Webster は、名詞の signature の1つ目の意味を「本人が書いた、または付けた、その人の名前」とし、6つ目に「ほかと区別し、見分ける役目をするもの(旋律・スタイル・ロゴなど)」を挙げています。形容詞としては「ある人や物と強く結びつき、それと分かる」という意味で、初出は1929年とされています。語源は中世ラテン語の signatura で、ラテン語の signare(しるしを付ける・印を押す)にさかのぼります。
つまり signature には、最初から2つの面があります。
① 署名(名前を書くこと)
書類のサイン
メールの末尾の署名
電子署名(デジタル署名)
② 見分けるしるし・特徴
関数・メソッドのシグネチャ
ファイルシグネチャ
シグネチャーメニュー・シグネチャーモデル
IT の分野で出てくるシグネチャの多くは、②の「見分けるしるし」のほうです。関数のシグネチャは「その関数をほかの関数と見分ける形」、ファイルシグネチャは「そのファイルの形式を見分けるバイト列」です。①と②を取り違えると、「シグネチャを確認して」と言われたときに、メールの署名を見るのか、関数の引数を見るのかが分からなくなります。
「シグネチャー」「シグネチャ」「シグニチャ」の表記
どれも同じ signature です。デジタル大辞泉は「シグネチャー」を見出しにして「シグニチャー」とも書くとしています。IT の文書では、末尾の長音を省いた「シグネチャ」がよく使われます。この記事では、一般の言葉としては「シグネチャー」、プログラミングとファイルの話では「シグネチャ」と書きます。
分野別のシグネチャーの意味(一覧表)
この節では、シグネチャーが使われる場面ごとに、何を指しているのかが一覧で分かります。
同じ言葉でも、ビジネスの会話・プログラミング・ファイルの話では指すものが違います。 まず、ふだんの意味と IT での意味を並べます。
| 場面 | シグネチャーが指すもの | 例 |
|---|---|---|
| ふだん・ビジネス | 署名(サイン) | 書類の署名欄、クレジットカードの裏のサイン |
| メール | 本文の末尾に付ける送り主の情報 | 社名・部署・氏名・電話・メールアドレス |
| プログラミング | 関数・メソッドを見分ける形 | area(int, int)、(a: number) => string |
| ファイル | 形式を示す先頭のバイト列(マジックナンバー) | PNG の 89 50 4E 47、PDF の %PDF- |
| 電子署名 | 作成者と内容の変更を確かめるためのデータ | 電子契約、ソフトウェアの配布物の署名 |
| ウイルス対策ソフト | 既知の不正なプログラムを見分けるための特徴のデータ | 「定義ファイル(シグネチャ)を更新する」 |
| 料理・ブランド | その店・ブランドを代表する看板の品 | シグネチャーメニュー、シグネチャーモデル |
| 音楽 | 楽譜の先頭の記号 | key signature(調号)、time signature(拍子記号) |
ウイルス対策ソフトの「シグネチャ」は、既知の不正なプログラムに共通する特徴をまとめたデータのことで、製品によって「定義ファイル」「パターンファイル」とも呼ばれます。「シグネチャを最新にする」は、このデータを更新するという意味です。
料理やブランドの「シグネチャー〇〇」は、Merriam-Webster の形容詞の意味(ある人や物と強く結びつき、それと分かる)にあたります。シェフの名前を書く代わりに、その一皿が署名の役目をする、という言い方です。
1「誰の」が分かる
メールの署名・書類のサイン・電子署名。人や組織を示す。
2「どう呼ぶか」が分かる
関数・メソッドのシグネチャ。名前と引数の並びで、呼び出し方が決まる。
3「何の種類か」が分かる
ファイルシグネチャ、定義ファイル。データの特徴から種類を見分ける。
メールのシグネチャー(署名)の書き方と例
この節では、ビジネスメールの末尾に付けるシグネチャーの中身、書き方の例、Gmail と Outlook での設定の入口が分かります。
メールのシグネチャーは、本文の最後に付ける「送り主が誰で、どこへ連絡すればよいか」の情報です。 受け取った人が、電話をかけたいとき・住所を調べたいときに、メールを開くだけで済むようにするのが役目です。
--
株式会社サンプル商事 営業部
山田 太郎(Yamada Taro)
〒100-0000 東京都千代田区〇〇1-2-3 サンプルビル5階
TEL: 03-0000-0000
Mail: taro.yamada@example.com
https://www.example.com/
この例の行数と1行の幅を Python で数えた結果です(全角を2桁、半角を1桁として計算)。
3 桁 | '-- '
27 桁 | '株式会社サンプル商事 営業部'
24 桁 | '山田 太郎(Yamada Taro)'
50 桁 | '〒100-0000 東京都千代田区〇〇1-2-3 サンプルビル5階'
17 桁 | 'TEL: 03-0000-0000'
29 桁 | 'Mail: taro.yamada@example.com'
24 桁 | 'https://www.example.com/'
行数: 7 最大の幅: 50 桁(半角換算)
区切り行は '-- ' と等しいか: True
いちばん長いのは住所の行(50桁)でした。スマートフォンの画面で折り返されるのは、たいてい住所の行です。建物名を次の行に分けると、1行の幅をそろえやすくなります。
1行目の「-- 」は何か
例の1行目は、ハイフン2つと半角スペース1つです。RFC 3676 の 4.3 節は、本文と署名の区切りの行として「-- 」(ハイフン・ハイフン・スペース)を使うことを、ニュースグループとメールの両方で長く使われてきた習慣として紹介しています。メールソフトによっては、この行より下を署名として扱い、返信の引用から外します。飾りの罫線(====== や ━━━━)でも意味は伝わりますが、ソフトが署名として見分けられるのは「-- 」の形です。
署名に入れる項目
- 1社名・部署名正式な社名で書く。(株)などの略は社外向けでは避ける
- 2氏名と読み読みにくい名前はローマ字かふりがなを添える
- 3電話番号とメールアドレス急ぎの連絡先が分かるようにする。メールアドレスは転送されたときに役立つ
- 4住所と Web サイトの URL書類を送る相手には住所が要る。社内向けの署名では省いてよい
- 5長さは6〜8行に収める宣伝文やお知らせを足し過ぎると、本文より署名が長くなる
Gmail と Outlook での設定(パソコン)
どちらも、一度登録すると新しいメールに自動で付きます。手順とメニューの名前は、それぞれの公式ヘルプのものです。
Gmail:設定を開く
右上の設定アイコンをクリックし、「すべての設定を表示」を選ぶ。
Gmail:「署名」に入力して保存
「署名」のボックスに文字を入力し、ページ下部の「変更を保存」をクリックする。署名は最大 10,000 文字で、画像も文字数に数えられる。
新しい Outlook:署名の画面を開く
[設定]を開き、[アカウント]から[署名]に進む。アカウントが複数あるときは、署名を付けるアカウントを選ぶ。
新しい Outlook:署名を足して保存
[署名を追加]を選んで名前を付け、内容を入力する。新規メッセージ・返信・転送のどれに自動で付けるかを選び、[保存]を選ぶ。
スマートフォンのアプリや従来の Outlook は画面が違うため、公式ヘルプの該当のタブで確かめるのが確実です。メール本文の型(件名・宛名・結び)と例文は、関連記事「ビジネスメール例文集|依頼・催促・お詫び・日程調整と件名の型」で扱っています。
プログラミングのシグネチャとは(関数・メソッドのシグネチャ)
この節では、関数やメソッドの「シグネチャ」が何を指すのかと、言語によって範囲が違う理由が分かります。
関数・メソッドのシグネチャとは、その関数を「どう呼ぶか」を決める宣言の形のことです。 少なくとも名前と引数(個数・順番・型)が入ります。戻り値の型や、投げる例外まで入れるかは、言語と文脈で変わります。
MDN の用語集は、シグネチャを広く取っています。
関数シグネチャ (もしくは型シグネチャ、メソッドシグネチャ) は関数やメソッドの入力と出力を定義します。
MDN は、シグネチャに含まれうるものとして、引数とその型、返値とその型、発生する可能性のある例外、public や static のようなキーワードを挙げています。一方で Java の言語仕様は、もっと狭く定義しています(次の節)。「シグネチャ」と聞いたら、「戻り値も入れて話しているか」を確かめるのが、行き違いを防ぐ近道です。
「シグネチャを変えないで」と頼まれたとき
言語仕様の定義と、会話での使い方は同じとは限らない
シグネチャが大事にされる理由は3つあります。
- 呼び出す側との約束になる:中の処理を書き換えても、シグネチャが同じなら呼び出す側は直さずに済みます。
- 同じ名前の関数を見分ける材料になる:引数の型や個数が違う同名のメソッドを定義できる言語(オーバーロード)では、シグネチャで呼び先が決まります。
- ドキュメントの1行目になる:API リファレンスの各項目の先頭に書かれているのがシグネチャです。読めば、何を渡して何が返るかが分かります。
ここからは、4つの言語で「同じ名前の関数を2つ書いたらどうなるか」を実際に試し、言語仕様の言い方と照らし合わせます。
Javaのメソッドシグネチャ:戻り値と例外は含まない
この節では、Java の言語仕様でのシグネチャの範囲と、オーバーロードができる場合・できない場合のコンパイルエラーの原文が分かります。
Java のメソッドのシグネチャは「名前・型パラメーター・仮引数の型」で、戻り値の型と throws 節は含みません。 Java 言語仕様(Java SE 21)の 8.4.2 は、2つのメソッドが同じシグネチャを持つ条件を「同じ名前、同じ型パラメーター(あれば)、(型パラメーターをそろえたあとで)同じ仮引数の型」としています。8.4 には、1つのクラスに override-equivalent(上書きとして同等)なシグネチャのメソッドを2つ宣言するとコンパイルエラーになる、とあります。
引数の型・個数が違えば、同じ名前で定義できる
public class Ok {
static int area(int side) { return side * side; }
static int area(int width, int height) { return width * height; }
static double area(double radius) { return Math.PI * radius * radius; }
public static void main(String[] args) {
System.out.println(area(3));
System.out.println(area(3, 4));
System.out.println(area(1.0));
}
}
$ javac -d out Ok.java && java -cp out Ok
9
12
3.141592653589793
3つの area は、シグネチャが area(int)・area(int, int)・area(double) と違うので、別のメソッドとして共存できます。これがオーバーロードです。
戻り値の型だけ・throws だけ・引数名だけを変えてもエラー
次の3つは、どれも「シグネチャが同じ」と判定されてコンパイルできませんでした。
// Ret.java:戻り値の型だけが違う
static int parse(String s) { return Integer.parseInt(s); }
static long parse(String s) { return Long.parseLong(s); }
// Thr.java:throws 節だけが違う
static void load(String path) throws IOException { }
static void load(String path) throws InterruptedException { }
// Nam.java:引数の名前だけが違う
static int add(int a, int b) { return a + b; }
static int add(int x, int y) { return x + y; }
Ret.java:3: error: method parse(String) is already defined in class Ret
static long parse(String s) { return Long.parseLong(s); }
^
1 error
Thr.java:5: error: method load(String) is already defined in class Thr
static void load(String path) throws InterruptedException { }
^
1 error
Nam.java:3: error: method add(int,int) is already defined in class Nam
static int add(int x, int y) { return x + y; }
^
1 error
エラー文の method parse(String)・method add(int,int) という書き方が、そのまま Java のシグネチャです。戻り値の型も、引数の名前も、throws も出てきません。
ジェネリクスの型引数だけが違う場合
static void show(List<String> names) { }
static void show(List<Integer> numbers) { }
Era.java:5: error: name clash: show(List<Integer>) and show(List<String>) have the same erasure
static void show(List<Integer> numbers) { }
^
1 error
ソースの上では引数の型が違って見えますが、コンパイル後は型引数が消えて(erasure)どちらも show(List) になるため、ぶつかります。エラー文は already defined ではなく name clash ... have the same erasure でした。
クラスファイルの中では戻り値も記録される
javap -s で、コンパイルしたクラスの中身を見ます。
$ javap -s -cp out Ok
static int area(int);
descriptor: (I)I
static int area(int, int);
descriptor: (II)I
static double area(double);
descriptor: (D)D
(II)I は「int を2つ受け取り、int を返す」という意味です。Java 仮想マシン仕様の 4.3.3 はこれを「メソッド記述子(method descriptor)」と呼び、引数の型と戻り値の型の両方を含むとしています。Java 言語のシグネチャ(戻り値を含まない)と、クラスファイルの記述子(戻り値を含む)は別のものです。リフレクションやバイトコードを扱う文書で「シグネチャ」と書かれているときは、記述子のほうを指していることがあります。
オーバーライドとの違いや @Override の役目は、関連記事「Javaオーバーライドとオーバーロードの違い|@Overrideの役割」で扱っています。
TypeScriptのシグネチャ:オーバーロード・呼び出し・インデックス
この節では、TypeScript で「シグネチャ」と名の付く3つの書き方と、tsc が出すエラーの原文が分かります。
TypeScript では、シグネチャは「型として書いた関数の形」で、引数の型と戻り値の型の両方を含みます。 Handbook には、呼び出しシグネチャ(call signature)、オーバーロードシグネチャ(overload signature)、実装シグネチャ(implementation signature)、インデックスシグネチャ(index signature)などが出てきます。
同じ名前の関数を2つ実装するとエラー
function area(side: number): number {
return side * side;
}
function area(width: number, height: number): number {
return width * height;
}
dup.ts(1,10): error TS2393: Duplicate function implementation.
dup.ts(4,10): error TS2393: Duplicate function implementation.
Java と違い、本体のある関数を同じ名前で2つは書けません。実行時の JavaScript には、引数の型で関数を呼び分ける仕組みが無いためです。
オーバーロードシグネチャ:宣言だけを複数書く
function area(side: number): number;
function area(width: number, height: number): number;
function area(a: number, b?: number): number {
return b === undefined ? a * a : a * b;
}
console.log(area(3));
console.log(area(3, 4));
$ tsc --strict --target es2022 --outDir out ok.ts && node out/ok.js
9
12
上の2行(本体なし)がオーバーロードシグネチャ、3つ目(本体あり)が実装シグネチャです。Handbook は、実装のシグネチャは外からは見えないと説明しています。出力された JavaScript を見ると、残っているのは実装の1つだけでした。
"use strict";
function area(a, b) {
return b === undefined ? a * a : a * b;
}
console.log(area(3));
console.log(area(3, 4));
シグネチャに合わない呼び出しは、コンパイルの時点で止まります。
area("3"); // call.ts(7,6): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'.
area(1, 2, 3); // call.ts(8,12): error TS2554: Expected 1-2 arguments, but got 3.
Handbook は、可能ならオーバーロードよりもユニオン型の引数を選ぶことを勧めています。書き分け方は、関連記事「TypeScript オーバーロードの書き方|引数の型で戻り値を変える3つの方法」で扱っています。
関数の型:引数の名前は見ない、戻り値の型は見る
type Handler = (id: number, label: string) => boolean;
const byName: Handler = (key, text) => text.length > key; // 引数名が違っても通る
const fewer: Handler = (id) => id > 0; // 引数が少なくても通る
const wrongRet: Handler = (id, label) => label; // 戻り値の型が違う
const wrongArg: Handler = (id: string, label: string) => true; // 引数の型が違う
ftype.ts(5,42): error TS2322: Type 'string' is not assignable to type 'boolean'.
ftype.ts(6,7): error TS2322: Type '(id: string, label: string) => true' is not assignable to type 'Handler'.
Types of parameters 'id' and 'id' are incompatible.
Type 'number' is not assignable to type 'string'.
3・4行目はエラーにならず、5・6行目だけがエラーになりました。引数の名前と「引数が少ないこと」は問われず、引数の型と戻り値の型が合っているかが見られています。
インデックスシグネチャは別物
名前が似ていますが、インデックスシグネチャは関数ではなく、オブジェクトの「キーの型と値の型」を書く構文です。
interface Prices {
[item: string]: number;
}
const prices: Prices = { apple: 120, banana: 80 };
prices.melon = "高い";
idx.ts(5,1): error TS2322: Type 'string' is not assignable to type 'number'.
使いどころは、関連記事「TypeScriptオブジェクト型定義|Recordとインデックスシグネチャ」で扱っています。
Pythonのシグネチャ:inspect.signatureで見る
この節では、Python の関数のシグネチャを inspect.signature で取り出した結果と、同じ名前の関数を2つ書いたときの動きが分かります。
Python では、標準ライブラリの inspect.signature() に関数を渡すと、シグネチャを表す Signature オブジェクトが返ります。 公式ドキュメントは、Signature オブジェクトを「関数の呼び出しシグネチャと戻り値のアノテーションを表現します」と説明しています。
import inspect
def send(to: str, subject: str = "(件名なし)", *cc: str, urgent: bool = False, **headers: str) -> bool:
return True
sig = inspect.signature(send)
print(sig)
for name, p in sig.parameters.items():
print(f"{name:8} {p.kind.description:24} default={p.default!r}")
print("return:", sig.return_annotation)
print(inspect.signature(len))
print(inspect.signature(print))
print(inspect.signature(sorted))
(to: str, subject: str = '(件名なし)', *cc: str, urgent: bool = False, **headers: str) -> bool
to positional or keyword default=<class 'inspect._empty'>
subject positional or keyword default='(件名なし)'
cc variadic positional default=<class 'inspect._empty'>
urgent keyword-only default=False
headers variadic keyword default=<class 'inspect._empty'>
return: <class 'bool'>
(obj, /)
(*args, sep=' ', end='\n', file=None, flush=False)
(iterable, /, *, key=None, reverse=False)
読み方は次のとおりです。
| 出力に出た種類 | 定数の名前 | 意味 |
|---|---|---|
| positional or keyword | POSITIONAL_OR_KEYWORD | 位置でも名前でも渡せる(ふつうの引数) |
| variadic positional | VAR_POSITIONAL | *cc。残りの位置引数をまとめて受け取る |
| keyword-only | KEYWORD_ONLY | * や *cc より後ろ。名前を付けてしか渡せない |
| variadic keyword | VAR_KEYWORD | **headers。残りの名前付き引数をまとめて受け取る |
(/ より前) |
POSITIONAL_ONLY | 位置でしか渡せない。len(obj, /) の obj |
len のシグネチャが (obj, /) と出たので、len(obj=[1, 2]) のように名前を付けては呼べないことが、実行する前に分かります。default=<class 'inspect._empty'> は「既定値が無い(必ず渡す)」というしるしです。
同じ名前の関数を2つ書くと、後のものが残る
def area(side):
return side * side
def area(width, height):
return width * height
print(area(3, 4))
print(area(3))
12
Traceback (most recent call last):
File "/srv/s4/r17/t346/py/dup.py", line 10, in <module>
print(area(3))
~~~~^^^
TypeError: area() missing 1 required positional argument: 'height'
定義した時点ではエラーになりません。def は「名前に関数を結びつける」文なので、2つ目の def が1つ目を置き換えます。エラーが出るのは、置き換えられた1つ目の形で呼んだ時(実行時)です。Java や Go のようにコンパイルで止まらない点に注意が要ります。
呼ぶ前に、引数がシグネチャに合うかを確かめる
Signature.bind() は、関数を実行せずに、渡した引数がどの名前に割り当てられるかを返します。合わなければ TypeError になります。
def area(width, height=1, *, unit="cm"):
return f"{width * height}{unit}2"
sig = inspect.signature(area)
print(sig.bind(3, 4).arguments)
print(sig.bind(3, unit="m").arguments)
sig.bind(3, 4, 5) # 多すぎる
sig.bind() # 足りない
{'width': 3, 'height': 4}
{'width': 3, 'unit': 'm'}
TypeError: too many positional arguments
TypeError: missing a required argument: 'width'
引数の型で処理を分けたいとき
Python で、引数の型によって呼び先を変えるには、標準ライブラリの functools.singledispatch が使えます。最初の引数の型で、登録した関数に振り分けます。
from functools import singledispatch
@singledispatch
def show(value):
return f"その他: {value!r}"
@show.register
def _(value: int):
return f"整数: {value}"
@show.register
def _(value: str):
return f"文字列: {value}"
print(show(3))
print(show("3"))
print(show(3.0))
整数: 3
文字列: 3
その他: 3.0
型ヒント(アノテーション)の書き方は、関連記事「Pythonの型ヒントの書き方|3.12以降の新しい書き方まで」で扱っています。
Goのシグネチャ:オーバーロードは無い
この節では、Go の言語仕様でのシグネチャの定義と、同じ名前の関数・メソッドを2つ書いたときのエラーの原文が分かります。
Go では、シグネチャは「引数の並びと結果(戻り値)の並び」で、関数の名前と引数の名前は含みません。 言語仕様の文法は次のとおりです。
FunctionType = "func" Signature .
Signature = Parameters [ Result ] .
Result = Parameters | Type .
仕様は、2つの関数型が同じになる条件を「引数と結果の個数が同じで、対応する型が同じで、可変長かどうかが一致すること。引数と結果の名前は一致しなくてよい」としています。
同じ名前の関数・メソッドは宣言できない
func area(side int) int {
return side * side
}
func area(width, height int) int {
return width * height
}
$ go run dup.go
# command-line-arguments
./dup.go:9:6: area redeclared in this block
./dup.go:5:6: other declaration of area
メソッドでも同じです。
type Shape struct{}
func (s Shape) Area(side int) int { return side * side }
func (s Shape) Area(width, height int) int { return width * height }
meth/main.go:6:16: method Shape.Area already declared at meth/main.go:5:16
Go の公式 FAQ は、オーバーロードを入れなかった理由を「型の照合が要らなければメソッドの呼び分けが単純になる。ほかの言語の経験から、同じ名前でシグネチャの違うメソッドは便利なこともあるが、分かりにくく壊れやすいこともあった」と説明しています。Go では AreaOfSquare・AreaOfRect のように名前を分けるか、可変長引数(nums ...int)を使います。
%T でシグネチャを表示する
type BinaryOp func(a, b int) int
func add(x, y int) int { return x + y }
func divide(a, b int) (int, error) {
if b == 0 {
return 0, fmt.Errorf("0 では割れません")
}
return a / b, nil
}
func sum(nums ...int) int { /* 省略 */ }
func main() {
var op BinaryOp = add // 引数名が違っても、型が同じなら代入できる
fmt.Println(op(2, 3))
fmt.Printf("%T\n", add)
fmt.Printf("%T\n", divide)
fmt.Printf("%T\n", sum)
fmt.Printf("%T\n", fmt.Println)
}
5
func(int, int) int
func(int, int) (int, error)
func(...int) int
func(...interface {}) (int, error)
%T の出力には、関数名も引数名も出ません。add の引数名は x, y、BinaryOp は a, b ですが、型が同じなので代入できました。戻り値が違う divide を代入すると、コンパイルで止まります。
ng/main.go:12:20: cannot use divide (value of type func(a int, b int) (int, error)) as BinaryOp value in variable declaration
Go には例外を宣言する構文が無く、失敗は error という戻り値で返します。つまり Go では、「失敗するかもしれない」という情報が、戻り値としてシグネチャに入ります。
4言語のシグネチャの範囲を比べる(判断表)
この節では、Java・TypeScript・Python・Go でシグネチャに何が入るかの違いと、関数を直すときにどこまで変えてよいかの目安が分かります。
| 言語 | シグネチャに入るもの | 戻り値 | 例外 | 同名で引数違いの定義 |
|---|---|---|---|---|
| Java | 名前・型パラメーター・仮引数の型(言語仕様 8.4.2) | 入らない | 入らない(throws 節) | できる。戻り値だけの違いは already defined |
| TypeScript | 引数の型と戻り値の型(呼び出しシグネチャ) | 入る | 書く構文が無い | 宣言だけ複数書ける。実装は1つ(TS2393) |
| Python | 引数(種類・既定値・注釈)と戻り値の注釈(inspect) | 注釈として入る | 入らない | できない。後の def が残る |
| Go | 引数の型の並びと結果の型の並び(言語仕様) | 入る | error を戻り値で返す | できない(redeclared) |
「引数の名前」は、Java・Go では型の一致に関係しませんでした。ただし Python はキーワード引数で呼べるため、引数の名前を変えると area(width=3) のような呼び出しが動かなくなります。名前も約束の一部です。
公開している関数を直すときの判断表
| 変えたいこと | 呼び出す側への影響 | 進め方 |
|---|---|---|
| 中の処理だけ | なし(シグネチャは同じ) | そのまま直す。結果が変わるならテストで確かめる |
| 引数を足す | 既定値が無ければ、すべての呼び出しが壊れる | 既定値を付ける。Java・Go は別のメソッド・関数を足す |
| 引数の順番・型を変える | 壊れる。型が同じ引数の入れ替えはコンパイルで見つからない | 新しい名前の関数を足し、前の関数は残して移行する |
| 引数の名前を変える | Python のキーワード引数、TypeScript のオブジェクト引数で壊れる | 呼び出しを検索してから。位置専用(/)なら影響なし |
| 戻り値の型を変える | Java・Go・TypeScript はコンパイルで見つかる。Python は実行時 | シグネチャの変更として扱い、利用側と相談する |
| 関数の名前を変える | すべての呼び出しが壊れる | エディターの名前変更の機能でまとめて直す |
ファイルシグネチャ(マジックナンバー)とは:xxdとfileで見る
この節では、ファイルの形式を示す先頭のバイト列を、PNG・JPEG・PDF・ZIP などで実際に見た結果が分かります。
ファイルシグネチャとは、ファイルの先頭(形式によっては決まった位置)に置かれた、その形式に固有のバイト列です。 マジックナンバーとも呼ばれます。プログラムは、ファイル名の拡張子ではなく、このバイト列を見て「これは PNG だ」「これは ZIP だ」と判断できます。
自分で作った7つのファイルの先頭16バイトを、xxd -l 16 で表示しました。左が16進、右が文字として読んだものです。
$ xxd -l 16 sample.png
00000000: 8950 4e47 0d0a 1a0a 0000 000d 4948 4452 .PNG........IHDR
$ xxd -l 16 sample.jpg
00000000: ffd8 ffe0 0010 4a46 4946 0001 0100 0001 ......JFIF......
$ xxd -l 16 sample.gif
00000000: 4749 4638 3761 0200 0200 8100 00e8 8e2c GIF87a.........,
$ xxd -l 16 sample.pdf
00000000: 2550 4446 2d31 2e34 0a31 2030 206f 626a %PDF-1.4.1 0 obj
$ xxd -l 16 sample.zip
00000000: 504b 0304 1400 0000 0800 b26c 6b5d 94ff PK.........lk]..
$ xxd -l 16 sample.docx
00000000: 504b 0304 1400 0000 0800 b26c 6b5d cc54 PK.........lk].T
$ xxd -l 16 memo.txt
00000000: 7369 676e 6174 7572 650a signature.
| 形式 | 先頭のバイト(16進) | 文字として読むと | 手元の出力・仕様 |
|---|---|---|---|
| PNG | 89 50 4E 47 0D 0A 1A 0A | .PNG.... | W3C の PNG 仕様 5.2 が8バイトを定めている |
| JPEG | FF D8 FF | (文字にならない) | FF D8 が画像の開始。続く FF E0 のあとに JFIF |
| GIF | 47 49 46 38 37 61 | GIF87a | 版によって GIF89a のこともある |
| 25 50 44 46 2D | %PDF- | 続けて版の番号(ここでは 1.4) | |
| ZIP | 50 4B 03 04 | PK.. | APPNOTE の local file header signature |
| docx | 50 4B 03 04 | PK.. | 中身は ZIP。先頭は ZIP と同じ |
| テキスト | (決まったものは無い) | 本文そのもの | 1バイト目から本文が始まる |
W3C の PNG 仕様は、この8バイトについて「PNG のデータをほかの種類のデータと区別し、転送の誤りの一部を早く見つけられるようにする」と説明しています。PKWARE の ZIP の仕様(APPNOTE)には local file header signature 4 bytes (0x04034b50) とあります。0x04034b50 を下位のバイトから並べる(リトルエンディアン)と 50 4b 03 04 になり、xxd の出力と一致しました。50 4b は文字にすると「PK」です。
file コマンドは中身で形式を判定する
$ file sample.* memo.txt
sample.docx: Microsoft Word 2007+
sample.gif: GIF image data, version 87a, 2 x 2
sample.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 2x2, components 3
sample.pdf: PDF document, version 1.4, 1 page(s)
sample.png: PNG image data, 2 x 2, 8-bit/color RGB, non-interlaced
sample.zip: Zip archive data, at least v2.0 to extract, compression method=deflate
memo.txt: ASCII text
$ file --mime-type sample.png sample.pdf sample.zip
sample.png: image/png
sample.pdf: application/pdf
sample.zip: application/zip
sample.docx と sample.zip は先頭の4バイトが同じ(PK)ですが、file は docx を「Microsoft Word 2007+」と判定しました。先頭のシグネチャだけでなく、ZIP の中に入っているファイルの名前まで見て区別しています。シグネチャが同じでも、形式が同じとは限りません。
バイト列の読み方や、16進で編集する方法は、関連記事「バイナリエディタとは|使い方・おすすめとxxdで読む実例・戻し方」で扱っています。
拡張子を変えても、中身のシグネチャで判定できる
この節では、ファイル名の拡張子を書き換えても中身は変わらないことを、実際に試した結果で確かめられます。
拡張子はファイル名の一部で、中身のバイト列とは関係がありません。 名前を変えても、先頭のシグネチャはそのままです。4つのファイルを、わざと違う拡張子の名前でコピーしました。
$ cp sample.png report.pdf
$ cp sample.pdf photo.jpg
$ cp sample.zip song.mp3
$ cp sample.jpg noext
$ file report.pdf photo.jpg song.mp3 noext
report.pdf: PNG image data, 2 x 2, 8-bit/color RGB, non-interlaced
photo.jpg: PDF document, version 1.4, 1 page(s)
song.mp3: Zip archive data, at least v2.0 to extract, compression method=deflate
noext: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1, segment length 16, baseline, precision 8, 2x2, components 3
file は名前にだまされず、4つとも元の形式を答えました。拡張子の無い noext も JPEG と判定されています。
同じ判定を、Python で書くとこうなります。拡張子から推測する mimetypes.guess_type と、先頭の8バイトを見る自作の関数を並べました。
import mimetypes
SIG = [
(b"\x89PNG\r\n\x1a\n", "PNG"),
(b"\xff\xd8\xff", "JPEG"),
(b"%PDF-", "PDF"),
(b"PK\x03\x04", "ZIP"),
(b"GIF87a", "GIF"),
(b"GIF89a", "GIF"),
]
def sniff(path):
head = open(path, "rb").read(8)
for sig, name in SIG:
if head.startswith(sig):
return name
return "不明"
| ファイル名 | 拡張子からの推測 | 先頭バイトからの判定 |
|---|---|---|
| report.pdf | application/pdf | PNG |
| photo.jpg | image/jpeg | |
| song.mp3 | audio/mpeg | ZIP |
| noext | None | JPEG |
| sample.docx | (Word 文書の MIME タイプ) | ZIP |
| memo.txt | text/plain | 不明 |
拡張子からの推測は、名前を変えた4つすべてで外れました。一方、先頭バイトだけの判定も、docx を「ZIP」、テキストを「不明」と答えています。拡張子と先頭バイトは、片方だけでは決めきれないので、両方を見るのが堅実です。
「開けないファイル」を受け取ったとき
file ファイル名 か xxd -l 16 ファイル名 で先頭を見る。形式が分かってから、合う拡張子に直す拡張子の書き換えで中身が変換されることはない
なお、ファイルシグネチャで分かるのは「どの形式として作られているか」までです。中身が正しく最後まで読めるか、信頼できる相手が作ったものかは、シグネチャからは分かりません。作成者を確かめる役目は、次の節の電子署名が受け持ちます。
電子署名(デジタル署名)とシグネチャーの違い
この節では、電子署名が何を確かめるためのものかと、メールの署名との違いが分かります。
電子署名は、電子の文書やデータについて「誰が作ったか」と「あとから内容が変わっていないか」を確かめられるようにする仕組みです。 英語では digital signature(electronic signature)で、同じ signature ですが、日本語では「シグネチャー」と書かずに「署名」と訳すのがふつうです。
デジタル庁は、電子署名のページで次のように説明しています。
契約書等の電子文書の作成者のなりすましや内容の改ざんを防ぐ電子署名について法律上の定義や効力を規定するとともに、電子署名の正当性を確認する認証業務のうち一定の基準を満たすものについて認定制度を設けています。
制度の内容や、どのサービスが認定を受けているかは、デジタル庁のページ(参考・出典に記載)が入口です。個別の契約や書類でどう扱われるかは、提供元や専門家の説明を確かめるのが確実です。
署名と検証を手元で試す
「内容が変わっていないかを確かめられる」とはどういうことかを、OpenSSL で試しました。見積書に見立てた1行のテキストに署名し、検証します。
$ cat doc.txt
見積書 第12号 合計 120,000円
$ openssl genpkey -algorithm ed25519 -out key.pem
$ openssl pkey -in key.pem -pubout -out pub.pem
$ openssl pkeyutl -sign -inkey key.pem -rawin -in doc.txt -out doc.sig
$ openssl pkeyutl -verify -pubin -inkey pub.pem -rawin -in doc.txt -sigfile doc.sig
Signature Verified Successfully
できた署名(doc.sig)は64バイトでした。次に、金額の1文字だけを書き換えたファイルを、同じ署名で検証します。
$ sed 's/120,000/720,000/' doc.txt > doc2.txt
$ openssl pkeyutl -verify -pubin -inkey pub.pem -rawin -in doc2.txt -sigfile doc.sig
Signature Verification Failure
1文字違うだけで、検証は失敗しました。署名は「この内容に対して、この鍵の持ち主が付けた」ことを示すデータなので、内容が少しでも変わると合わなくなります。鍵の持ち主が本当に名乗っている本人かどうかは、証明書を発行する認証の仕組みが受け持ちます。
メールのシグネチャー(署名)
本文の末尾に書く文字
誰でも同じ文字を書ける
役目は連絡先を伝えること
電子署名(デジタル署名)
鍵を使って計算したデータ
鍵が無いと作れず、内容が変わると検証に失敗する
役目は作成者と変更の有無を確かめること
メールの末尾に名前が書いてあっても、それは電子署名ではありません。IT用語辞典バイナリも、メールのシグネチャについて、データやメッセージの正当性を示す電子署名とは別のもの、と注記しています。
シグネチャーでよくあるつまずき(エラー原文つき)
この節では、シグネチャーという言葉の取り違えと、コード・ファイルで実際に出たエラーや出力の読み方が一覧で分かります。
| つまずき | 出た原文・状況 | 原因と直し方 |
|---|---|---|
| Java:戻り値だけ変えた同名メソッド | method parse(String) is already defined in class Ret |
戻り値はシグネチャに入らない。名前を分ける(parseInt・parseLong) |
| Java:List の型引数だけ違う | name clash: ... have the same erasure |
コンパイル後は同じ型になる。名前を分けるか、引数の型を変える |
| TypeScript:同名の関数を2つ実装 | error TS2393: Duplicate function implementation. |
宣言だけを並べ、実装は1つにする。またはユニオン型の引数にする |
| TypeScript:関数の型に合わない | error TS2322: Type 'string' is not assignable to type 'boolean'. |
戻り値の型もシグネチャの一部。型か実装のどちらかを直す |
| Python:同名の def を2つ書いた | TypeError: area() missing 1 required positional argument: 'height' |
後の定義で置き換わっている。名前を分けるか、既定値・singledispatch を使う |
| Go:同名の関数・メソッド | area redeclared in this block |
オーバーロードは無い。名前を分けるか、可変長引数にする |
| Go:戻り値の違う関数を代入 | cannot use divide (value of type ...) as BinaryOp value |
戻り値もシグネチャの一部。関数型の定義を合わせる |
| 拡張子を変えたのに開けない | report.pdf: PNG image data |
中身は変わっていない。file で形式を確かめ、正しい拡張子に戻す |
| docx が ZIP と判定された | 先頭が 50 4b 03 04(PK) |
docx・xlsx・pptx は ZIP の入れ物。先頭バイトだけでは区別できない |
| メールの署名が引用に残り続ける | 区切りが罫線だけ | 「-- 」(ハイフン2つと半角スペース)の行で区切る |
| 「シグネチャを更新して」の意味が分からない | 文脈で指すものが違う | メールの署名か、関数の形か、ウイルス対策ソフトの定義ファイルかを聞き返す |
言葉の取り違えを防ぐ手順は、次の3つです。
- 1話している対象を確かめるメール・コード・ファイル・ウイルス対策ソフトのどれの話か
- 2コードなら、戻り値を含めるかを確かめるJava の言語仕様では含まないが、会話では含めて使う人が多い
- 3迷ったら実物を見せ合う関数の宣言の1行、xxd の出力、署名のテキストを貼る
よくある質問
Q. シグネチャーとは何ですか? A. 英語の signature で、もとの意味は「署名」です。そこから「そのものを見分けるしるし・特徴」という意味でも使われます。メールでは末尾の署名、プログラミングでは関数の名前と引数の並び、ファイルでは形式を示す先頭のバイト列を指します。
Q. シグネチャーとシグネチャ、シグニチャの違いは何ですか? A. 表記が違うだけで、同じ signature です。デジタル大辞泉は「シグネチャー」を見出しに「シグニチャー」とも書くとしています。IT の文書では、長音を省いた「シグネチャ」が多く使われます。
Q. メールのシグネチャーには何を書きますか? A. 社名・部署名、氏名(読みを添える)、電話番号、メールアドレス、住所、Web サイトの URL です。6〜8行に収め、本文との間は「-- 」(ハイフン2つと半角スペース)の行で区切ると、メールソフトが署名として見分けられます。
Q. 関数のシグネチャに戻り値の型は含まれますか? A. 言語によります。Java の言語仕様では含みません(名前・型パラメーター・仮引数の型だけ)。TypeScript と Go では含みます。Python の inspect.signature は、戻り値の注釈もシグネチャの一部として返します。会話では、戻り値まで含めて「シグネチャ」と呼ぶことが多いです。
Q. Java で戻り値の型だけが違うメソッドを定義できますか?
A. できません。手元の javac 21 では method parse(String) is already defined in class Ret というエラーになりました。throws 節だけ、引数の名前だけを変えた場合も同じエラーです。
Q. Python にオーバーロードはありますか? A. 同じ名前の関数を2つ定義すると、後のものが前のものを置き換えます。引数の違いは、既定値・可変長引数・キーワード引数で受けるのが基本です。型で振り分けたいときは functools.singledispatch が使えます。
Q. inspect.signature は何に使いますか?
A. 関数の引数の名前・種類・既定値・注釈を、実行時に取り出すのに使います。Signature.bind() を使うと、関数を呼ぶ前に、引数が合っているかを確かめられます。デコレーターやフレームワークが、渡された関数の形に合わせて動きを変えるときにも使われます。
Q. ファイルシグネチャとマジックナンバーは同じものですか?
A. ファイルの形式を示すバイト列という意味では、同じものを指します。PNG の仕様は「PNG signature」、ZIP の仕様は「local file header signature」と呼んでいます。file コマンドが判定に使うデータベースは magic と呼ばれます。
Q. 拡張子を変えるとファイルの形式は変わりますか?
A. 変わりません。PNG を report.pdf という名前でコピーして file で調べると、PNG image data と表示されました。形式を変えるには、変換するソフトで保存し直します。
Q. xxd が入っていないときは、どうやって先頭バイトを見ますか?
A. od -A x -t x1z -N 16 ファイル名 でも同じように見られます(手元の PNG で 89 50 4e 47 0d 0a 1a 0a と表示されました)。xxd は Vim に付いてくることが多いコマンドです。Python なら open(path, "rb").read(8) で先頭の8バイトを読めます。
Q. メールの署名と電子署名は同じですか? A. 別のものです。メールの署名は末尾に書く連絡先の文字で、誰でも書けます。電子署名は鍵を使って計算したデータで、作成者と、内容が変わっていないことを確かめるために使います。
Q. シグネチャーメニュー・シグネチャーモデルとは何ですか? A. その店やブランドを代表する看板の品のことです。英語の signature には「ある人や物と強く結びつき、それと分かる」という形容詞の意味があり、signature dish(看板料理)のように使います。
まとめ
- シグネチャー(signature)は「署名」と、そこから広がった「見分けるしるし・特徴」を表す。メールでは末尾の署名、プログラミングでは関数の形、ファイルでは先頭のバイト列を指す。
- 関数のシグネチャの範囲は言語で違う。Java は名前と引数の型だけで、戻り値と throws を含まない。TypeScript と Go は戻り値を含み、Python の inspect.signature は戻り値の注釈も返す。
- 同じ名前の関数を2つ書くと、Java は引数が違えば共存、TypeScript は TS2393、Go は redeclared、Python は後の定義が残って実行時に TypeError になった。
- ファイルシグネチャは PNG が
89 50 4E 47 0D 0A 1A 0A、JPEG がFF D8 FF、PDF が%PDF-、ZIP が50 4B 03 04。拡張子を変えてもfileは中身で判定した。 - 電子署名は、作成者と内容の変更の有無を確かめる仕組みで、メールの署名とは別のもの。手元では、1文字の書き換えで検証が失敗した。
参考・出典
確認日はいずれも 2026年11月11日です。
- 小学館「デジタル大辞泉」シグネチャー(Weblio 辞書に掲載):https://www.weblio.jp/content/シグネチャー
- Merriam-Webster「signature」:https://www.merriam-webster.com/dictionary/signature
- MDN Web Docs 用語集「シグネチャ(関数)」:https://developer.mozilla.org/ja/docs/Glossary/Signature/Function
- Oracle「The Java Language Specification, Java SE 21 Edition」8.4.2 Method Signature・8.4.9 Overloading:https://docs.oracle.com/javase/specs/jls/se21/html/jls-8.html
- Oracle「The Java Virtual Machine Specification, Java SE 21 Edition」4.3.3 Method Descriptors:https://docs.oracle.com/javase/specs/jvms/se21/html/jvms-4.html
- TypeScript Handbook「More on Functions」(Call Signatures・Function Overloads):https://www.typescriptlang.org/docs/handbook/2/functions.html
- TypeScript Handbook「Object Types」(Index Signatures):https://www.typescriptlang.org/docs/handbook/2/objects.html
- Python 公式ドキュメント「inspect ― 活動中のオブジェクトの情報を取得する」:https://docs.python.org/ja/3/library/inspect.html
- The Go Programming Language Specification(Function types・Type identity):https://go.dev/ref/spec
- Go「Frequently Asked Questions」(Why does Go not support overloading of methods and operators?):https://go.dev/doc/faq
- W3C「Portable Network Graphics (PNG) Specification (Third Edition)」5.2 PNG signature:https://www.w3.org/TR/png-3/
- PKWARE「APPNOTE.TXT - .ZIP File Format Specification」:https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT
- IETF「RFC 3676 The Text/Plain Format and DelSp Parameters」4.3 Usenet Signature Convention:https://www.rfc-editor.org/rfc/rfc3676
- Gmail ヘルプ「Gmail の署名を作成する」:https://support.google.com/mail/answer/8395?hl=ja
- Microsoft サポート「Outlook で電子メールの署名を作成して追加する」:https://support.microsoft.com/ja-jp/office/8ee5d4f4-68fd-464a-a1c1-0e1c80bb27f2
- デジタル庁「電子署名」:https://www.digital.go.jp/policies/digitalsign
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「シグネチャーとは|意味をIT・ビジネス別に解説(メール署名・関数・ファイル)」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。