-
Notifications
You must be signed in to change notification settings - Fork 79
/
Copy pathcrc32.xml
138 lines (132 loc) · 4.74 KB
/
crc32.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: e095023e408c8cb6378ae16bb6870343a3946919 Maintainer: takagi Status: ready -->
<!-- CREDITS: hirokawa,shimooka,mumumu -->
<refentry xmlns="http://docbook.org/ns/docbook" xml:id="function.crc32">
<refnamediv>
<refname>crc32</refname>
<refpurpose>文字列の crc32 多項式計算を行う</refpurpose>
</refnamediv>
<refsect1 role="description">
&reftitle.description;
<methodsynopsis>
<type>int</type><methodname>crc32</methodname>
<methodparam><type>string</type><parameter>string</parameter></methodparam>
</methodsynopsis>
<para>
<parameter>string</parameter> の 32 ビット長の CRC (cyclic redundancy
checksum) チェックサムを生成します。
これは通常、送信したデータの整合性を検証するために使用します。
</para>
<warning>
<simpara>
PHP の整数型は符号付きで、多くの crc32
チェックサムは 32 ビットシステム上では負の整数になります。
しかし、64 ビット環境では <function>crc32</function>
の結果はすべて正の整数となります。
</simpara>
<simpara>
つまり、符号なしの <function>crc32</function> チェックサムの文字列表記を
十進形式で取得するには、
<function>sprintf</function> もしくは <function>printf</function> の
"%u" フォーマッタを使う必要があります。
</simpara>
<simpara>
チェックサムの十六進表記を取得するには、<function>sprintf</function> あるいは <function>printf</function>
の "%x" フォーマッタを使うか、あるいは変換関数
<function>dechex</function> を使います。これらはいずれも、
<function>crc32</function> の結果を符号なし整数に変換することも行います。
</simpara>
<simpara>
64 ビット環境でも、大きな戻り値に対して負の整数を返すことが検討されました。
しかしその場合、負の整数には余計な オフセット 0xFFFFFFFF######## が付くので、十六進変換が壊れてしまいます。
十六進表現は最もよく使われる形式なので、この処理が壊れないようにしました。
32 ビット環境から 64 ビット環境に移したときに
ほぼ 50% の確率で十進形式での比較が失敗してしまいますが、
それよりも十六進表記のほうを優先したのです。
</simpara>
<simpara>
今思えば、この関数が整数値を返すようにしたというのがまずい判断でした。
最初から、<function>md5</function>
のように十六進形式の文字列を直接返すようにしておけばよかったのでしょう。
</simpara>
<simpara>
移植性を考慮した選択肢として、より汎用的な
<function>hash</function> を使う方法もあります。
<code>hash("crc32b", $str)</code> は
<code>str_pad(dechex(crc32($str)), 8, '0', STR_PAD_LEFT)</code> と同じ文字列を返します。
</simpara>
</warning>
</refsect1>
<refsect1 role="parameters">
&reftitle.parameters;
<para>
<variablelist>
<varlistentry>
<term><parameter>string</parameter></term>
<listitem>
<para>
データ。
</para>
</listitem>
</varlistentry>
</variablelist>
</para>
</refsect1>
<refsect1 role="returnvalues">
&reftitle.returnvalues;
<para>
<parameter>string</parameter> の crc32 チェックサムを整数値で返します。
</para>
</refsect1>
<refsect1 role="examples">
&reftitle.examples;
<para>
<example>
<title>crc32 チェックサムの表示</title>
<para>
この例は <function>printf</function>
関数を用いた変換後のチェックサムの表示方法を示しています。
</para>
<programlisting role="php">
<![CDATA[
<?php
$checksum = crc32("The quick brown fox jumped over the lazy dog.");
printf("%u\n", $checksum);
?>
]]>
</programlisting>
</example>
</para>
</refsect1>
<refsect1 role="seealso">
&reftitle.seealso;
<para>
<simplelist>
<member><function>hash</function></member>
<member><function>md5</function></member>
<member><function>sha1</function></member>
</simplelist>
</para>
</refsect1>
</refentry>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->